diff --git a/FrameBuffer.cpp b/FrameBuffer.cpp index 4c32d05c..af013738 100644 --- a/FrameBuffer.cpp +++ b/FrameBuffer.cpp @@ -938,14 +938,12 @@ bool DepthBufferToRDRAM::CopyToRDRAM( u32 _address) { for (u32 y = 0; y < VI.height; ++y) { for (u32 x = 0; x < VI.width; ++x) { f32 z = ptr_src[x + (VI.height - y - 1)*VI.width]; - if (z == 1.0f) - ptr_dst[(x + y*VI.width) ^ 1] = zLUT[0x3FFFF]; - else { - z = z*2.0f - 1.0f; - z = (z*scale + trans) * 8.0f; - const u32 idx = min(0x3FFFFU, u32(floorf(z + 0.5f))); - ptr_dst[(x + y*VI.width) ^ 1] = zLUT[idx]; + u32 idx = 0x3FFFF; + if (z < 1.0f) { + z *= 262144.0f; + idx = min(0x3FFFFU, u32(floorf(z + 0.5f))); } + ptr_dst[(x + y*VI.width) ^ 1] = zLUT[idx]; } } diff --git a/GLSLCombiner.cpp b/GLSLCombiner.cpp index 14575da4..7f8ca5a3 100644 --- a/GLSLCombiner.cpp +++ b/GLSLCombiner.cpp @@ -682,6 +682,7 @@ void ShaderCombiner::_locateUniforms() { LocateUniform(uTexScale); LocateUniform(uScreenScale); + LocateUniform(uDepthScale); LocateUniform(uTexOffset[0]); LocateUniform(uTexOffset[1]); LocateUniform(uTexMask[0]); @@ -922,6 +923,8 @@ void ShaderCombiner::updateFBInfo(bool _bForce) { } void ShaderCombiner::updateDepthInfo(bool _bForce) { + _setFV2Uniform(m_uniforms.uDepthScale, gSP.viewport.vscale[2], gSP.viewport.vtrans[2], _bForce); + if (!video().getRender().isImageTexturesSupported()) return; @@ -991,9 +994,6 @@ void SetDepthFogCombiner() int loc = glGetUniformLocation(g_draw_shadow_map_program, "uFogColor"); if (loc >= 0) glUniform4fv(loc, 1, &gDP.fogColor.r); - loc = glGetUniformLocation(g_draw_shadow_map_program, "uDepthScale"); - if (loc >= 0) - glUniform2f(loc, gSP.viewport.vscale[2] * 32768.0f, gSP.viewport.vtrans[2] * 32768.0f); gDP.changed |= CHANGED_COMBINE; } diff --git a/GLSLCombiner.h b/GLSLCombiner.h index 8061fe3c..082902f1 100644 --- a/GLSLCombiner.h +++ b/GLSLCombiner.h @@ -47,7 +47,7 @@ private: fv4Uniform uEnvColor, uPrimColor, uFogColor, uCenterColor, uScaleColor, uBlendColor; - fv2Uniform uTexScale, uScreenScale, uTexOffset[2], uTexMask[2], + fv2Uniform uTexScale, uScreenScale, uDepthScale, uTexOffset[2], uTexMask[2], uCacheShiftScale[2], uCacheScale[2], uCacheOffset[2]; fv3Uniform uLightDirection[8], uLightColor[8]; diff --git a/Shaders.h b/Shaders.h index bc402fcb..70bd3c9c 100644 --- a/Shaders.h +++ b/Shaders.h @@ -138,6 +138,7 @@ static const char* fragment_shader_header_common_variables = "uniform lowp int uFb8Bit; \n" "uniform lowp int uFbFixedAlpha;\n" "uniform lowp int uSpecialBlendMode;\n" +"uniform mediump vec2 uDepthScale; \n" "in lowp vec4 vShadeColor; \n" "in mediump vec2 vTexCoord0;\n" "in mediump vec2 vTexCoord1;\n" @@ -275,6 +276,7 @@ static const char* fragment_shader_header_main = " \n" "void main() \n" "{ \n" +" gl_FragDepth = clamp((gl_FragCoord.z * 2.0 - 1.0) * uDepthScale.s + uDepthScale.t, 0.0, 1.0); \n" " if (uAlphaCompareMode == 3) {//dither \n" " if (snoise() < 0.0) discard; \n" " } \n" @@ -568,12 +570,12 @@ static const char* depth_compare_shader_float = " ivec2 coord = ivec2(gl_FragCoord.xy); \n" " highp vec4 depth = imageLoad(uDepthImage,coord); \n" " highp float bufZ = depth.r; \n" -" highp float curZ = gl_FragCoord.z; \n" +" highp float curZ = gl_FragDepth; \n" " highp float dz, dzMin; \n" " if (uDepthSource == 1) { \n" " dzMin = dz = uDeltaZ; \n" " } else { \n" -" dz = 4.0*fwidth(gl_FragCoord.z); \n" +" dz = 4.0*fwidth(gl_FragDepth); \n" " dzMin = min(dz, depth.g); \n" " } \n" " const bool bInfront = curZ < bufZ; \n" @@ -622,15 +624,12 @@ static const char* shadow_map_fragment_shader_float = "layout(binding = 0, r16ui) uniform readonly uimage2D uZlutImage;\n" "layout(binding = 1, r16ui) uniform readonly uimage1D uTlutImage;\n" "uniform lowp vec4 uFogColor; \n" -"uniform mediump vec2 uDepthScale; \n" "out lowp vec4 fragColor; \n" "lowp float get_alpha() \n" "{ \n" " ivec2 coord = ivec2(gl_FragCoord.xy); \n" " highp float bufZ = texelFetch(uDepthImage,coord, 0).r; \n" -" highp float fZ = 2.0*bufZ - 1.0; \n" -" fZ = (uDepthScale.x*fZ + uDepthScale.y)*8.0; \n" -" const highp int iZ = int(floor(fZ + 0.5)); \n" +" const highp int iZ = bufZ > 0.999 ? 262143 : int(floor(bufZ * 262143.0));\n" " int y0 = clamp(iZ/512, 0, 511); \n" " int x0 = iZ - 512*y0; \n" " uint iN64z = imageLoad(uZlutImage,ivec2(x0,y0)).r; \n"