diff --git a/data/shaders/parallaxmapping/parallax.frag b/data/shaders/parallaxmapping/parallax.frag index 8460331c..566114c4 100644 --- a/data/shaders/parallaxmapping/parallax.frag +++ b/data/shaders/parallaxmapping/parallax.frag @@ -123,17 +123,21 @@ void main(void) break; } + // Perform sampling before (potentially) discarding. + // This is to avoid implicit derivatives in non-uniform control flow. + vec3 normalHeightMapLod = textureLod(sNormalHeightMap, uv, 0.0).rgb; + vec3 color = texture(sColorMap, uv).rgb; + // Discard fragments at texture border if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) { discard; } - vec3 N = normalize(textureLod(sNormalHeightMap, uv, 0.0).rgb * 2.0 - 1.0); + vec3 N = normalize(normalHeightMapLod * 2.0 - 1.0); vec3 L = normalize(inTangentLightPos - inTangentFragPos); vec3 R = reflect(-L, N); vec3 H = normalize(L + V); - vec3 color = texture(sColorMap, uv).rgb; vec3 ambient = 0.2 * color; vec3 diffuse = max(dot(L, N), 0.0) * color; vec3 specular = vec3(0.15) * pow(max(dot(N, H), 0.0), 32.0); diff --git a/data/shaders/parallaxmapping/parallax.frag.spv b/data/shaders/parallaxmapping/parallax.frag.spv index 2bfa7b1f..f591ae65 100644 Binary files a/data/shaders/parallaxmapping/parallax.frag.spv and b/data/shaders/parallaxmapping/parallax.frag.spv differ diff --git a/data/shaders/subpasses/transparent.frag b/data/shaders/subpasses/transparent.frag index c59cc995..ca860f55 100644 --- a/data/shaders/subpasses/transparent.frag +++ b/data/shaders/subpasses/transparent.frag @@ -21,10 +21,14 @@ void main () { // Sample depth from deferred depth buffer and discard if obscured float depth = subpassLoad(samplerPositionDepth).a; + + // Save the sampled texture color before discarding. + // This is to avoid implicit derivatives in non-uniform control flow. + vec4 sampledColor = texture(samplerTexture, inUV); if ((depth != 0.0) && (linearDepth(gl_FragCoord.z) > depth)) { discard; }; - outColor = texture(samplerTexture, inUV); + outColor = sampledColor; } diff --git a/data/shaders/subpasses/transparent.frag.spv b/data/shaders/subpasses/transparent.frag.spv index c7427890..42fd097a 100644 Binary files a/data/shaders/subpasses/transparent.frag.spv and b/data/shaders/subpasses/transparent.frag.spv differ