REVIEWED: Potential shader issues
This commit is contained in:
parent
af163ba22a
commit
fddfb58f85
5 changed files with 30 additions and 34 deletions
|
@ -22,5 +22,5 @@ void main()
|
||||||
float depth = (2.0*zNear)/(zFar + zNear - z*(zFar - zNear));
|
float depth = (2.0*zNear)/(zFar + zNear - z*(zFar - zNear));
|
||||||
|
|
||||||
// Calculate final fragment color
|
// Calculate final fragment color
|
||||||
gl_FragColor = vec4(depth, depth, depth, 1.0f);
|
gl_FragColor = vec4(depth, depth, depth, 1.0);
|
||||||
}
|
}
|
|
@ -48,31 +48,31 @@ void main()
|
||||||
// Shadow calculations
|
// 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.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;
|
vec2 sampleCoords = fragPosLightSpace.xy;
|
||||||
float curDepth = fragPosLightSpace.z;
|
float curDepth = fragPosLightSpace.z;
|
||||||
|
|
||||||
// Slope-scale depth bias: depth biasing reduces "shadow acne" artifacts, where dark stripes appear all over the scene.
|
// 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
|
// 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
|
// 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;
|
int shadowCounter = 0;
|
||||||
const int numSamples = 9;
|
const int numSamples = 9;
|
||||||
|
|
||||||
// PCF (percentage-closer filtering) algorithm:
|
// PCF (percentage-closer filtering) algorithm:
|
||||||
// Instead of testing if just one point is closer to the current point,
|
// Instead of testing if just one point is closer to the current point,
|
||||||
// we test the surrounding points as well.
|
// we test the surrounding points as well.
|
||||||
// This blurs shadow edges, hiding aliasing artifacts.
|
// 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 x = -1; x <= 1; x++)
|
||||||
{
|
{
|
||||||
for (int y = -1; y <= 1; y++)
|
for (int y = -1; y <= 1; y++)
|
||||||
{
|
{
|
||||||
float sampleDepth = texture2D(shadowMap, sampleCoords + texelSize*vec2(x, y)).r;
|
float sampleDepth = texture2D(shadowMap, sampleCoords + texelSize*vec2(x, y)).r;
|
||||||
if (curDepth - bias > sampleDepth)
|
if (curDepth - bias > sampleDepth) shadowCounter++;
|
||||||
{
|
|
||||||
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
|
// Add ambient lighting whether in shadow or not
|
||||||
|
|
|
@ -23,5 +23,5 @@ void main()
|
||||||
float depth = (2.0*zNear)/(zFar + zNear - z*(zFar - zNear));
|
float depth = (2.0*zNear)/(zFar + zNear - z*(zFar - zNear));
|
||||||
|
|
||||||
// Calculate final fragment color
|
// Calculate final fragment color
|
||||||
finalColor = vec4(depth, depth, depth, 1.0f);
|
finalColor = vec4(depth, depth, depth, 1.0);
|
||||||
}
|
}
|
|
@ -12,23 +12,20 @@ uniform vec2 offset; // Offset of the scale.
|
||||||
uniform float zoom; // Zoom of the scale.
|
uniform float zoom; // Zoom of the scale.
|
||||||
|
|
||||||
const int maxIterations = 255; // Max iterations to do.
|
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
|
// Square a complex number
|
||||||
vec2 ComplexSquare(vec2 z)
|
vec2 ComplexSquare(vec2 z)
|
||||||
{
|
{
|
||||||
return vec2(
|
return vec2(z.x*z.x - z.y*z.y, z.x*z.y*2.0);
|
||||||
z.x*z.x - z.y*z.y,
|
|
||||||
z.x*z.y*2.0f
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert Hue Saturation Value (HSV) color into RGB
|
// Convert Hue Saturation Value (HSV) color into RGB
|
||||||
vec3 Hsv2rgb(vec3 c)
|
vec3 Hsv2rgb(vec3 c)
|
||||||
{
|
{
|
||||||
vec4 K = vec4(1.0f, 2.0f/3.0f, 1.0f/3.0f, 3.0f);
|
vec4 K = vec4(1.0, 2.0/3.0, 1.0/3.0, 3.0);
|
||||||
vec3 p = abs(fract(c.xxx + K.xyz)*6.0f - K.www);
|
vec3 p = abs(fract(c.xxx + K.xyz)*6.0 - K.www);
|
||||||
return c.z*mix(K.xxx, clamp(p - K.xxx, 0.0f, 1.0f), c.y);
|
return c.z*mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
|
@ -54,7 +51,7 @@ void main()
|
||||||
|
|
||||||
// The pixel coordinates are scaled so they are on the mandelbrot scale
|
// 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
|
// 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.x += offset.x;
|
||||||
z.y += offset.y;
|
z.y += offset.y;
|
||||||
|
|
||||||
|
@ -63,7 +60,7 @@ void main()
|
||||||
{
|
{
|
||||||
z = ComplexSquare(z) + c; // Iterate function
|
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.
|
// Another few iterations decreases errors in the smoothing calculation.
|
||||||
|
@ -72,12 +69,12 @@ void main()
|
||||||
z = ComplexSquare(z) + c;
|
z = ComplexSquare(z) + c;
|
||||||
|
|
||||||
// This last part smooths the color (again see link above).
|
// 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.
|
// Normalize the value so it is between 0 and 1.
|
||||||
float norm = smoothVal/float(maxIterations);
|
float norm = smoothVal/float(maxIterations);
|
||||||
|
|
||||||
// If in set, color black. 0.999 allows for some float accuracy error.
|
// 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);
|
if (norm > 0.999) finalColor = vec4(0.0, 0.0, 0.0, 1.0);
|
||||||
else finalColor = vec4(Hsv2rgb(vec3(norm*colorCycles, 1.0f, 1.0f)), 1.0f);
|
else finalColor = vec4(Hsv2rgb(vec3(norm*colorCycles, 1.0, 1.0)), 1.0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,29 +51,28 @@ void main()
|
||||||
// Shadow calculations
|
// 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.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;
|
vec2 sampleCoords = fragPosLightSpace.xy;
|
||||||
float curDepth = fragPosLightSpace.z;
|
float curDepth = fragPosLightSpace.z;
|
||||||
|
|
||||||
// Slope-scale depth bias: depth biasing reduces "shadow acne" artifacts, where dark stripes appear all over the scene.
|
// 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
|
// 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
|
// 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;
|
int shadowCounter = 0;
|
||||||
const int numSamples = 9;
|
const int numSamples = 9;
|
||||||
|
|
||||||
// PCF (percentage-closer filtering) algorithm:
|
// PCF (percentage-closer filtering) algorithm:
|
||||||
// Instead of testing if just one point is closer to the current point,
|
// Instead of testing if just one point is closer to the current point,
|
||||||
// we test the surrounding points as well.
|
// we test the surrounding points as well.
|
||||||
// This blurs shadow edges, hiding aliasing artifacts.
|
// 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 x = -1; x <= 1; x++)
|
||||||
{
|
{
|
||||||
for (int y = -1; y <= 1; y++)
|
for (int y = -1; y <= 1; y++)
|
||||||
{
|
{
|
||||||
float sampleDepth = texture(shadowMap, sampleCoords + texelSize*vec2(x, y)).r;
|
float sampleDepth = texture(shadowMap, sampleCoords + texelSize*vec2(x, y)).r;
|
||||||
if (curDepth - bias > sampleDepth)
|
if (curDepth - bias > sampleDepth) shadowCounter++;
|
||||||
{
|
|
||||||
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));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue