Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #version 450
- #define NUM_CASCADES 4
- layout (location = 0) in vec3 inNormal;
- layout (location = 1) in float inPosViewZ;
- layout (location = 2) in vec3 inPosWorld;
- layout (location = 0) out vec4 outColor;
- layout (binding = 1) uniform ShadowData
- {
- mat4 cascadeProjs[NUM_CASCADES];
- vec4 cascadeSplits;
- vec3 lightDir;
- } shadowData;
- layout (binding = 2) uniform sampler2DArray shadowMapArray;
- vec4 color = vec4(1.0, 1.0, 1.0, 1.0);
- void main()
- {
- // Get cascade index for the current fragment's view position
- uint cascadeIndex = 0;
- for(uint i = 0; i < NUM_CASCADES - 1; ++i)
- {
- if(inPosViewZ > shadowData.cascadeSplits[i])
- {
- cascadeIndex = i + 1;
- }
- }
- if (cascadeIndex == 0) { color = vec4(1.0, 0.0, 0.0, 1.0); }
- if (cascadeIndex == 1) { color = vec4(0.0, 0.0, 1.0, 1.0); }
- if (cascadeIndex == 2) { color = vec4(0.0, 1.0, 0.0, 1.0); }
- if (cascadeIndex == 3) { color = vec4(1.0, 1.0, 0.0, 1.0); }
- vec4 shadowCoord = shadowData.cascadeProjs[cascadeIndex] * vec4(inPosWorld, 1.0);
- shadowCoord.xyz /= shadowCoord.w;
- shadowCoord.xy = shadowCoord.xy * 0.5 + 0.5;
- //if (shadowCoord.z > -1.0 && shadowCoord.z < 0.0) { color = vec4(1.0, 0.0, 1.0, 1.0); } // debugging purposes
- float shadow = 1.0;
- if (shadowCoord.z >= -1.0 && shadowCoord.z <= 1.0
- && shadowCoord.x >= -1.0 && shadowCoord.x <= 1.0
- && shadowCoord.y >= -1.0 && shadowCoord.y <= 1.0 && shadowCoord.w > 0.0
- )
- {
- float shadowDepth = texture(shadowMapArray, vec3(shadowCoord.st, cascadeIndex)).r;
- float bias = 0.005;
- if (shadowDepth < shadowCoord.z - bias)
- {
- shadow = 0.3;
- }
- }
- vec3 lightDir = normalize(shadowData.lightDir);
- vec3 normal = normalize(inNormal);
- float diffuse = max(dot(-lightDir, normal), 0.3);
- outColor = color * diffuse * shadow;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement