diff --git a/Common/GPU/Shader.cpp b/Common/GPU/Shader.cpp index 2fe810bb73..19becbd320 100644 --- a/Common/GPU/Shader.cpp +++ b/Common/GPU/Shader.cpp @@ -50,6 +50,7 @@ void ShaderLanguageDesc::Init(ShaderLanguage lang) { lastFragData = nullptr; gles = false; forceMatrix4x4 = true; + depthMinusOneToOne = true; break; case GLSL_3xx: // Just used in the shader test. @@ -67,6 +68,7 @@ void ShaderLanguageDesc::Init(ShaderLanguage lang) { gles = true; forceMatrix4x4 = true; glslES30 = true; + depthMinusOneToOne = true; break; case GLSL_VULKAN: fragColor0 = "fragColor0"; @@ -86,6 +88,7 @@ void ShaderLanguageDesc::Init(ShaderLanguage lang) { forceMatrix4x4 = false; coefsFromBuffers = true; vertexIndex = true; + depthMinusOneToOne = false; break; case HLSL_D3D11: fragColor0 = "outfragment.target"; @@ -107,6 +110,7 @@ void ShaderLanguageDesc::Init(ShaderLanguage lang) { coefsFromBuffers = true; vsOutPrefix = "Out."; viewportYSign = "-"; + depthMinusOneToOne = false; break; } } diff --git a/Common/GPU/Shader.h b/Common/GPU/Shader.h index 5dbb6a5490..45e54cab54 100644 --- a/Common/GPU/Shader.h +++ b/Common/GPU/Shader.h @@ -57,6 +57,7 @@ struct ShaderLanguageDesc { const char *vsOutPrefix = ""; const char *viewportYSign = ""; + bool depthMinusOneToOne = false; bool vertexIndex = false; bool glslES30 = false; // really glslES30Features. TODO: Clean this up. bool bitwiseOps = false; diff --git a/Common/GPU/ShaderWriter.cpp b/Common/GPU/ShaderWriter.cpp index ecdee31eb1..1bcfa95b68 100644 --- a/Common/GPU/ShaderWriter.cpp +++ b/Common/GPU/ShaderWriter.cpp @@ -361,6 +361,9 @@ void ShaderWriter::EndVSMain(Slice varyings) { if (strlen(lang_.viewportYSign)) { F(" gl_Position.y *= %s1.0;\n", lang_.viewportYSign); } + if (lang_.depthMinusOneToOne) { + F(" gl_Position.z = gl_Position.z * 2.0 - gl_Position.w;\n"); // homogenous math... looks confusing. + } C(" vs_out.pos = gl_Position;\n"); for (auto &varying : varyings) { F(" vs_out.%s = %s;\n", varying.name, varying.name);