diff --git a/desmume/src/OGLRender.cpp b/desmume/src/OGLRender.cpp index bc0002d02..9c431cc7e 100644 --- a/desmume/src/OGLRender.cpp +++ b/desmume/src/OGLRender.cpp @@ -322,8 +322,11 @@ static const char *fragmentShader_100 = {"\ float newFragDepth = (stateUseWDepth) ? vtxPosition.w/4096.0 : clamp((vtxPosition.z/vertW) * 0.5 + 0.5, 0.0, 1.0); \n\ \n\ gl_FragData[0] = newFragColor;\n\ - gl_FragData[1] = vec4( packVec3FromFloat(newFragDepth), 1.0);\n\ gl_FragData[2] = vec4( float(polyEnableFog), float(stateEnableFogAlphaOnly), 0.0, 1.0);\n\ + if (newFragColor.a >= 1.0 || polySetNewDepthForTranslucent)\n\ + {\n\ + gl_FragData[1] = vec4( packVec3FromFloat(newFragDepth), 1.0);\n\ + }\n\ gl_FragDepth = newFragDepth;\n\ } \n\ "}; @@ -2196,7 +2199,6 @@ Render3DError OpenGLRenderer_1_2::SetupPolygon(const POLY *thePoly) if (this->isShaderSupported) { glUniform1i(OGLRef.uniformPolyMode, attr.polygonMode); - glUniform1i(OGLRef.uniformPolySetNewDepthForTranslucent, (attr.enableAlphaDepthWrite) ? GL_TRUE : GL_FALSE); glUniform1i(OGLRef.uniformPolyEnableFog, (attr.enableRenderFog) ? GL_TRUE : GL_FALSE); glUniform1f(OGLRef.uniformPolyAlpha, (!attr.isWireframe && attr.isTranslucent) ? divide5bitBy31_LUT[attr.alpha] : 1.0f); glUniform1i(OGLRef.uniformPolyID, attr.polygonID); @@ -2279,6 +2281,11 @@ Render3DError OpenGLRenderer_1_2::SetupPolygon(const POLY *thePoly) glDepthMask(enableDepthWrite); + if (this->isShaderSupported) + { + glUniform1i(OGLRef.uniformPolySetNewDepthForTranslucent, ((enableDepthWrite == GL_TRUE) || attr.enableAlphaDepthWrite) ? GL_TRUE : GL_FALSE); + } + return OGLERROR_NOERR; } @@ -3236,7 +3243,6 @@ Render3DError OpenGLRenderer_2_0::SetupPolygon(const POLY *thePoly) // Set up polygon attributes glUniform1i(OGLRef.uniformPolyMode, attr.polygonMode); - glUniform1i(OGLRef.uniformPolySetNewDepthForTranslucent, (attr.enableAlphaDepthWrite) ? GL_TRUE : GL_FALSE); glUniform1i(OGLRef.uniformPolyEnableFog, (attr.enableRenderFog) ? GL_TRUE : GL_FALSE); glUniform1f(OGLRef.uniformPolyAlpha, (!attr.isWireframe && attr.isTranslucent) ? divide5bitBy31_LUT[attr.alpha] : 1.0f); glUniform1i(OGLRef.uniformPolyID, attr.polygonID); @@ -3311,6 +3317,7 @@ Render3DError OpenGLRenderer_2_0::SetupPolygon(const POLY *thePoly) } glDepthMask(enableDepthWrite); + glUniform1i(OGLRef.uniformPolySetNewDepthForTranslucent, ((enableDepthWrite == GL_TRUE) || attr.enableAlphaDepthWrite) ? GL_TRUE : GL_FALSE); return OGLERROR_NOERR; } diff --git a/desmume/src/OGLRender_3_2.cpp b/desmume/src/OGLRender_3_2.cpp index 9968d9a31..02db86948 100644 --- a/desmume/src/OGLRender_3_2.cpp +++ b/desmume/src/OGLRender_3_2.cpp @@ -169,8 +169,11 @@ static const char *GeometryFragShader_150 = {"\ float newFragDepth = (stateUseWDepth) ? vtxPosition.w/4096.0 : clamp((vtxPosition.z/vertW) * 0.5 + 0.5, 0.0, 1.0); \n\ \n\ outFragColor = newFragColor;\n\ - outFragDepth = vec4( packVec3FromFloat(newFragDepth), 1.0);\n\ outFogAttributes = vec4( float(polyEnableFog), float(stateEnableFogAlphaOnly), 0.0, 1.0);\n\ + if (newFragColor.a >= 1.0 || polySetNewDepthForTranslucent)\n\ + {\n\ + outFragDepth = vec4( packVec3FromFloat(newFragDepth), 1.0);\n\ + }\n\ gl_FragDepth = newFragDepth;\n\ } \n\ "};