From fddfb58f85f0c14af4666dba4eed38b2184a4c6e Mon Sep 17 00:00:00 2001 From: Ray Date: Sun, 12 Jan 2025 20:39:07 +0100 Subject: [PATCH] REVIEWED: Potential shader issues --- .../resources/shaders/glsl100/depth.fs | 2 +- .../resources/shaders/glsl120/shadowmap.fs | 20 ++++++++-------- .../resources/shaders/glsl330/depth.fs | 2 +- .../resources/shaders/glsl330/julia_set.fs | 23 ++++++++----------- .../resources/shaders/glsl330/shadowmap.fs | 17 +++++++------- 5 files changed, 30 insertions(+), 34 deletions(-) diff --git a/examples/shaders/resources/shaders/glsl100/depth.fs b/examples/shaders/resources/shaders/glsl100/depth.fs index 78099278..001cca08 100644 --- a/examples/shaders/resources/shaders/glsl100/depth.fs +++ b/examples/shaders/resources/shaders/glsl100/depth.fs @@ -22,5 +22,5 @@ void main() float depth = (2.0*zNear)/(zFar + zNear - z*(zFar - zNear)); // Calculate final fragment color - gl_FragColor = vec4(depth, depth, depth, 1.0f); + gl_FragColor = vec4(depth, depth, depth, 1.0); } \ No newline at end of file diff --git a/examples/shaders/resources/shaders/glsl120/shadowmap.fs b/examples/shaders/resources/shaders/glsl120/shadowmap.fs index f43e6382..84f31859 100644 --- a/examples/shaders/resources/shaders/glsl120/shadowmap.fs +++ b/examples/shaders/resources/shaders/glsl120/shadowmap.fs @@ -46,34 +46,34 @@ void main() vec4 finalColor = (texelColor*((colDiffuse + vec4(specular, 1.0))*vec4(lightDot, 1.0))); // Shadow calculations - vec4 fragPosLightSpace = lightVP * vec4(fragPosition, 1); + vec4 fragPosLightSpace = lightVP*vec4(fragPosition, 1); fragPosLightSpace.xyz /= fragPosLightSpace.w; // Perform the perspective division - fragPosLightSpace.xyz = (fragPosLightSpace.xyz + 1.0f) / 2.0f; // Transform from [-1, 1] range to [0, 1] range + fragPosLightSpace.xyz = (fragPosLightSpace.xyz + 1.0)/2.0; // Transform from [-1, 1] range to [0, 1] range vec2 sampleCoords = fragPosLightSpace.xy; float curDepth = fragPosLightSpace.z; + // Slope-scale depth bias: depth biasing reduces "shadow acne" artifacts, where dark stripes appear all over the scene. // The solution is adding a small bias to the depth // In this case, the bias is proportional to the slope of the surface, relative to the light - float bias = max(0.0008 * (1.0 - dot(normal, l)), 0.00008); + float bias = max(0.0008*(1.0 - dot(normal, l)), 0.00008); int shadowCounter = 0; const int numSamples = 9; + // PCF (percentage-closer filtering) algorithm: // Instead of testing if just one point is closer to the current point, // we test the surrounding points as well. // This blurs shadow edges, hiding aliasing artifacts. - vec2 texelSize = vec2(1.0f / float(shadowMapResolution)); + vec2 texelSize = vec2(1.0/float(shadowMapResolution)); for (int x = -1; x <= 1; x++) { for (int y = -1; y <= 1; y++) { - float sampleDepth = texture2D(shadowMap, sampleCoords + texelSize * vec2(x, y)).r; - if (curDepth - bias > sampleDepth) - { - shadowCounter++; - } + float sampleDepth = texture2D(shadowMap, sampleCoords + texelSize*vec2(x, y)).r; + if (curDepth - bias > sampleDepth) shadowCounter++; } } - finalColor = mix(finalColor, vec4(0, 0, 0, 1), float(shadowCounter) / float(numSamples)); + + finalColor = mix(finalColor, vec4(0, 0, 0, 1), float(shadowCounter)/float(numSamples)); // Add ambient lighting whether in shadow or not finalColor += texelColor*(ambient/10.0)*colDiffuse; diff --git a/examples/shaders/resources/shaders/glsl330/depth.fs b/examples/shaders/resources/shaders/glsl330/depth.fs index f7546bbb..5c4a3de9 100644 --- a/examples/shaders/resources/shaders/glsl330/depth.fs +++ b/examples/shaders/resources/shaders/glsl330/depth.fs @@ -23,5 +23,5 @@ void main() float depth = (2.0*zNear)/(zFar + zNear - z*(zFar - zNear)); // Calculate final fragment color - finalColor = vec4(depth, depth, depth, 1.0f); + finalColor = vec4(depth, depth, depth, 1.0); } \ No newline at end of file diff --git a/examples/shaders/resources/shaders/glsl330/julia_set.fs b/examples/shaders/resources/shaders/glsl330/julia_set.fs index 7a6f069c..3a8e25de 100644 --- a/examples/shaders/resources/shaders/glsl330/julia_set.fs +++ b/examples/shaders/resources/shaders/glsl330/julia_set.fs @@ -12,23 +12,20 @@ uniform vec2 offset; // Offset of the scale. uniform float zoom; // Zoom of the scale. const int maxIterations = 255; // Max iterations to do. -const float colorCycles = 2.0f; // Number of times the color palette repeats. Can show higher detail for higher iteration numbers. +const float colorCycles = 2.0; // Number of times the color palette repeats. Can show higher detail for higher iteration numbers. // Square a complex number vec2 ComplexSquare(vec2 z) { - return vec2( - z.x*z.x - z.y*z.y, - z.x*z.y*2.0f - ); + return vec2(z.x*z.x - z.y*z.y, z.x*z.y*2.0); } // Convert Hue Saturation Value (HSV) color into RGB vec3 Hsv2rgb(vec3 c) { - vec4 K = vec4(1.0f, 2.0f/3.0f, 1.0f/3.0f, 3.0f); - vec3 p = abs(fract(c.xxx + K.xyz)*6.0f - K.www); - return c.z*mix(K.xxx, clamp(p - K.xxx, 0.0f, 1.0f), c.y); + vec4 K = vec4(1.0, 2.0/3.0, 1.0/3.0, 3.0); + vec3 p = abs(fract(c.xxx + K.xyz)*6.0 - K.www); + return c.z*mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); } void main() @@ -54,7 +51,7 @@ void main() // The pixel coordinates are scaled so they are on the mandelbrot scale // NOTE: fragTexCoord already comes as normalized screen coordinates but offset must be normalized before scaling and zoom - vec2 z = vec2((fragTexCoord.x - 0.5f)*2.5f, (fragTexCoord.y - 0.5f)*1.5f)/zoom; + vec2 z = vec2((fragTexCoord.x - 0.5f)*2.5, (fragTexCoord.y - 0.5)*1.5)/zoom; z.x += offset.x; z.y += offset.y; @@ -63,7 +60,7 @@ void main() { z = ComplexSquare(z) + c; // Iterate function - if (dot(z, z) > 4.0f) break; + if (dot(z, z) > 4.0) break; } // Another few iterations decreases errors in the smoothing calculation. @@ -72,12 +69,12 @@ void main() z = ComplexSquare(z) + c; // This last part smooths the color (again see link above). - float smoothVal = float(iterations) + 1.0f - (log(log(length(z)))/log(2.0f)); + float smoothVal = float(iterations) + 1.0 - (log(log(length(z)))/log(2.0)); // Normalize the value so it is between 0 and 1. float norm = smoothVal/float(maxIterations); // If in set, color black. 0.999 allows for some float accuracy error. - if (norm > 0.999f) finalColor = vec4(0.0f, 0.0f, 0.0f, 1.0f); - else finalColor = vec4(Hsv2rgb(vec3(norm*colorCycles, 1.0f, 1.0f)), 1.0f); + if (norm > 0.999) finalColor = vec4(0.0, 0.0, 0.0, 1.0); + else finalColor = vec4(Hsv2rgb(vec3(norm*colorCycles, 1.0, 1.0)), 1.0); } diff --git a/examples/shaders/resources/shaders/glsl330/shadowmap.fs b/examples/shaders/resources/shaders/glsl330/shadowmap.fs index 506b51a8..d535de2b 100644 --- a/examples/shaders/resources/shaders/glsl330/shadowmap.fs +++ b/examples/shaders/resources/shaders/glsl330/shadowmap.fs @@ -51,32 +51,31 @@ void main() // Shadow calculations vec4 fragPosLightSpace = lightVP * vec4(fragPosition, 1); fragPosLightSpace.xyz /= fragPosLightSpace.w; // Perform the perspective division - fragPosLightSpace.xyz = (fragPosLightSpace.xyz + 1.0f) / 2.0f; // Transform from [-1, 1] range to [0, 1] range + fragPosLightSpace.xyz = (fragPosLightSpace.xyz + 1.0)/2.0; // Transform from [-1, 1] range to [0, 1] range vec2 sampleCoords = fragPosLightSpace.xy; float curDepth = fragPosLightSpace.z; + // Slope-scale depth bias: depth biasing reduces "shadow acne" artifacts, where dark stripes appear all over the scene. // The solution is adding a small bias to the depth // In this case, the bias is proportional to the slope of the surface, relative to the light - float bias = max(0.0002 * (1.0 - dot(normal, l)), 0.00002) + 0.00001; + float bias = max(0.0002*(1.0 - dot(normal, l)), 0.00002) + 0.00001; int shadowCounter = 0; const int numSamples = 9; + // PCF (percentage-closer filtering) algorithm: // Instead of testing if just one point is closer to the current point, // we test the surrounding points as well. // This blurs shadow edges, hiding aliasing artifacts. - vec2 texelSize = vec2(1.0f / float(shadowMapResolution)); + vec2 texelSize = vec2(1.0/float(shadowMapResolution)); for (int x = -1; x <= 1; x++) { for (int y = -1; y <= 1; y++) { - float sampleDepth = texture(shadowMap, sampleCoords + texelSize * vec2(x, y)).r; - if (curDepth - bias > sampleDepth) - { - shadowCounter++; - } + float sampleDepth = texture(shadowMap, sampleCoords + texelSize*vec2(x, y)).r; + if (curDepth - bias > sampleDepth) shadowCounter++; } } - finalColor = mix(finalColor, vec4(0, 0, 0, 1), float(shadowCounter) / float(numSamples)); + finalColor = mix(finalColor, vec4(0, 0, 0, 1), float(shadowCounter)/float(numSamples)); // Add ambient lighting whether in shadow or not finalColor += texelColor*(ambient/10.0)*colDiffuse;