// XC_BUILTIN_FORWARD_LIT_OPENGL_PS #version 430 layout(binding = 0) uniform sampler2D uBaseColorTexture; layout(binding = 1) uniform sampler2D uShadowMapTexture; layout(std140, binding = 0) uniform PerObjectConstants { mat4 gProjectionMatrix; mat4 gViewMatrix; mat4 gModelMatrix; mat4 gNormalMatrix; }; layout(std140, binding = 1) uniform LightingConstants { vec4 gMainLightDirectionAndIntensity; vec4 gMainLightColorAndFlags; }; layout(std140, binding = 2) uniform MaterialConstants { vec4 gBaseColorFactor; }; layout(std140, binding = 3) uniform ShadowReceiverConstants { mat4 gWorldToShadowMatrix; vec4 gShadowBiasAndTexelSize; vec4 gShadowOptions; }; in vec3 vNormalWS; in vec2 vTexCoord; in vec3 vPositionWS; layout(location = 0) out vec4 fragColor; float ComputeShadowAttenuation(vec3 positionWS) { if (gShadowOptions.x < 0.5) { return 1.0; } vec4 shadowClip = gWorldToShadowMatrix * vec4(positionWS, 1.0); if (shadowClip.w <= 0.0) { return 1.0; } vec3 shadowNdc = shadowClip.xyz / shadowClip.w; vec2 shadowUv = vec2( shadowNdc.x * 0.5 + 0.5, shadowNdc.y * 0.5 + 0.5); if (shadowUv.x < 0.0 || shadowUv.x > 1.0 || shadowUv.y < 0.0 || shadowUv.y > 1.0 || shadowNdc.z < -1.0 || shadowNdc.z > 1.0) { return 1.0; } float shadowDepth = texture(uShadowMapTexture, shadowUv).r; float receiverDepth = shadowNdc.z * 0.5 + 0.5 - gShadowBiasAndTexelSize.x; float shadowStrength = clamp(gShadowBiasAndTexelSize.w, 0.0, 1.0); return receiverDepth <= shadowDepth ? 1.0 : (1.0 - shadowStrength); } void main() { vec4 baseColor = texture(uBaseColorTexture, vTexCoord) * gBaseColorFactor; if (gMainLightColorAndFlags.w < 0.5) { fragColor = baseColor; return; } vec3 normalWS = normalize(vNormalWS); vec3 directionToLightWS = normalize(gMainLightDirectionAndIntensity.xyz); float diffuse = max(dot(normalWS, directionToLightWS), 0.0); float shadowAttenuation = diffuse > 0.0 ? ComputeShadowAttenuation(vPositionWS) : 1.0; vec3 lighting = vec3(0.28) + gMainLightColorAndFlags.rgb * (diffuse * gMainLightDirectionAndIntensity.w * shadowAttenuation); fragColor = vec4(baseColor.rgb * lighting, baseColor.a); }