PCF for point shadows
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -3,3 +3,5 @@ build
|
|||||||
lib/assimp/libassimp.so.5.0.0
|
lib/assimp/libassimp.so.5.0.0
|
||||||
res/models
|
res/models
|
||||||
res/textures
|
res/textures
|
||||||
|
.kdev4/Fall-Fever.kdev4
|
||||||
|
Fall-Fever.kdev4
|
||||||
|
|||||||
@@ -70,6 +70,14 @@ uniform samplerCube u_texture_pointShadowMap0;
|
|||||||
//uniform samplerCube u_texture_pointShadowMap2;
|
//uniform samplerCube u_texture_pointShadowMap2;
|
||||||
//uniform samplerCube u_texture_pointShadowMap3;
|
//uniform samplerCube u_texture_pointShadowMap3;
|
||||||
|
|
||||||
|
vec3 sampleOffsetDirections[20] = vec3[] (
|
||||||
|
vec3( 1, 1, 1), vec3( 1, -1, 1), vec3(-1, -1, 1), vec3(-1, 1, 1),
|
||||||
|
vec3( 1, 1, -1), vec3( 1, -1, -1), vec3(-1, -1, -1), vec3(-1, 1, -1),
|
||||||
|
vec3( 1, 1, 0), vec3( 1, -1, 0), vec3(-1, -1, 0), vec3(-1, 1, 0),
|
||||||
|
vec3( 1, 0, 1), vec3(-1, 0, 1), vec3( 1, 0, -1), vec3(-1, 0, -1),
|
||||||
|
vec3( 0, 1, 1), vec3( 0, -1, 1), vec3( 0, -1, -1), vec3( 0, 1, -1)
|
||||||
|
);
|
||||||
|
|
||||||
uniform bool b_drawShadows;
|
uniform bool b_drawShadows;
|
||||||
|
|
||||||
uniform float pointShadowDepthMapFarPlane;
|
uniform float pointShadowDepthMapFarPlane;
|
||||||
@@ -120,8 +128,7 @@ vec3 directionalLightContribution(DirectionalLight light, vec3 normal, vec3 view
|
|||||||
computeShading(light.ambient, light.diffuse, light.specular, lightDir, viewDir, normal, ambient, diffuse, specular);
|
computeShading(light.ambient, light.diffuse, light.specular, lightDir, viewDir, normal, ambient, diffuse, specular);
|
||||||
|
|
||||||
float shadows = 0.0f;
|
float shadows = 0.0f;
|
||||||
//if(b_drawShadows)
|
if(b_drawShadows)
|
||||||
if(false)
|
|
||||||
shadows = computeDirectionalShadows(v_fragmentPositionDirectionalLightSpace, normal, lightDir);
|
shadows = computeDirectionalShadows(v_fragmentPositionDirectionalLightSpace, normal, lightDir);
|
||||||
|
|
||||||
return (ambient + (1.0f - shadows) * (diffuse + specular));
|
return (ambient + (1.0f - shadows) * (diffuse + specular));
|
||||||
@@ -245,18 +252,22 @@ float computePointShadows(vec3 fragPos, vec3 lightPos) {
|
|||||||
// get vector between fragment position and light position
|
// get vector between fragment position and light position
|
||||||
vec3 fragToLight = fragPos - lightPos;
|
vec3 fragToLight = fragPos - lightPos;
|
||||||
|
|
||||||
// use the light to fragment vector to sample from the depth map
|
|
||||||
float closestDepth = texture(u_texture_pointShadowMap0, fragToLight).r;
|
|
||||||
|
|
||||||
// it is currently in linear range between [0,1]. Re-transform back to original value
|
|
||||||
closestDepth *= pointShadowDepthMapFarPlane;
|
|
||||||
|
|
||||||
// now get current linear depth as the length between the fragment and light position
|
// now get current linear depth as the length between the fragment and light position
|
||||||
float currentDepth = length(fragToLight);
|
float currentDepth = length(fragToLight);
|
||||||
|
|
||||||
// now test for shadows
|
float shadow = 0.0;
|
||||||
float bias = 0.05;
|
float bias = 0.05;
|
||||||
float shadow = currentDepth - bias > closestDepth ? 1.0 : 0.0;
|
int samples = 20;
|
||||||
|
float viewDistance = length(u_viewPosition - fragPos);
|
||||||
|
float diskRadius = 0.05;
|
||||||
|
|
||||||
|
for(int i = 0; i < samples; ++i) {
|
||||||
|
float closestDepth = texture(u_texture_pointShadowMap0, fragToLight + sampleOffsetDirections[i] * diskRadius).r;
|
||||||
|
closestDepth *= pointShadowDepthMapFarPlane;
|
||||||
|
if(currentDepth - bias > closestDepth)
|
||||||
|
shadow += 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
shadow /= float(samples);
|
||||||
return shadow;
|
return shadow;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user