From 6ac9beaa616de7aa6418d425f6b8f3a37198931c Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Sat, 21 Jun 2025 21:44:22 +0800 Subject: [PATCH] [Fix] (Diligent/Shader): Flip vertex y for vertex shaders. --- MG/MG_UTIL/Program/GLSLTool.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/MG/MG_UTIL/Program/GLSLTool.cpp b/MG/MG_UTIL/Program/GLSLTool.cpp index a65dd079..f0d861e1 100644 --- a/MG/MG_UTIL/Program/GLSLTool.cpp +++ b/MG/MG_UTIL/Program/GLSLTool.cpp @@ -93,6 +93,8 @@ namespace MG_Util::Program { spvc_compiler_create_compiler_options(compiler, &options); spvc_compiler_options_set_uint(options, SPVC_COMPILER_OPTION_GLSL_VERSION, 450); spvc_compiler_options_set_bool(options, SPVC_COMPILER_OPTION_GLSL_ES, SPVC_FALSE); + spvc_compiler_options_set_bool(options, SPVC_COMPILER_OPTION_FLIP_VERTEX_Y, SPVC_TRUE); + spvc_compiler_install_compiler_options(compiler, options); if ((result = spvc_compiler_compile(compiler, &glsl_source)) != SPVC_SUCCESS) { @@ -105,7 +107,13 @@ namespace MG_Util::Program { output_glsl = glsl_source; spvc_context_destroy(context); - + MG_Util::Debug::LogI("[SPIRV-Cross] Converted GLSL:\n%s", output_glsl.c_str()); + + // TODO: Use other methods to implement clip space fixing. + size_t pos = output_glsl.find("\n gl_Position.y = -gl_Position.y;\n}"); + if (pos != std::string::npos) { + output_glsl.replace(pos, strlen("\n gl_Position.y = -gl_Position.y;\n}"), "\n gl_Position.y = -gl_Position.y;\n gl_Position.z = (gl_Position.z + gl_Position.w) * 0.5;\n}"); + } return output_glsl; }