A quick question.
Do I understand it correct, that I have to render my entire geometry twice for directional light shadows ?
1. Shadow map pass
2. Render geometry again for the projection ?
That sounds horrible :/
Posted 02 January 2013 - 07:18 AM
A quick question.
Do I understand it correct, that I have to render my entire geometry twice for directional light shadows ?
1. Shadow map pass
2. Render geometry again for the projection ?
That sounds horrible :/
Student at the Games-Academy Frankfurt, Germany.
Posted 02 January 2013 - 08:52 AM
Edited by Ashaman73, 02 January 2013 - 08:55 AM.
Posted 02 January 2013 - 10:20 AM
Edited by noizex, 02 January 2013 - 10:21 AM.
Posted 02 January 2013 - 10:45 AM
Edited by lipsryme, 02 January 2013 - 10:48 AM.
Student at the Games-Academy Frankfurt, Germany.
Posted 02 January 2013 - 11:14 AM
Posted 02 January 2013 - 11:21 AM
I am using function for projection and depth comparison:
//Position - world position of objects from G-buffer
float shadowCast(float3 Position)
{
float4 texcoord = mul(float4(Position, 1.0), LightInvertViewProjection);
texcoord.x = ((texcoord.x / texcoord.w) * 0.5 ) + 0.5;
texcoord.y = ((texcoord.y / texcoord.w) * -0.5 ) + 0.5;
depth = tex2D(shadows, texcoord.xy);
return (texcoord.z < length(depth)*bias+offset);
}
It works well for me, don't forget to tweak bias and offset to reduce acne and peter paning ![]()
.
Posted 02 January 2013 - 03:33 PM
I am using function for projection and depth comparison:
//Position - world position of objects from G-bufferfloat shadowCast(float3 Position){ float4 texcoord = mul(float4(Position, 1.0), LightInvertViewProjection); texcoord.x = ((texcoord.x / texcoord.w) * 0.5 ) + 0.5; texcoord.y = ((texcoord.y / texcoord.w) * -0.5 ) + 0.5; depth = tex2D(shadows, texcoord.xy); return (texcoord.z < length(depth)*bias+offset);}It works well for me, don't forget to tweak bias and offset to reduce acne and peter paning
.
Wait why is it the inverse of the view projection ?
What would the result of world space position multiplied by an inverse view projection be...again world space but this time in the light's space ?
UPDATE:
oh my god it works ;)
The problem I had all the time was that the view space reconstruction I had used did not work for the shadow projection.
Not sure why it works with my lighting though...
For anyone interested this is the code that works (ofc without any optimization):
VSO VS(VSI input)
{
VSO output = (VSO)0;
output.Position = input.Position;
output.UV = input.UV;
float3 positionVS = mul(input.Position, InverseProjection);
output.ViewRay = float3(positionVS.xy / positionVS.z, 1.0f);
return output;
}
float4 PS(VSO input) : SV_TARGET0
{
float4 output = float4(0.0f, 0.0f, 0.0f, 1.0f);
float3 ViewRay = input.ViewRay.xyz;
float depth = DepthTarget.Sample(PointSampler, input.UV).r;
float nearClip = 0.01f;
float farClip = 100.0f;
float ProjectionA = farClip / (farClip - nearClip);
float ProjectionB = (-farClip * nearClip) / (farClip - nearClip);
float linearDepth = ProjectionB / (depth - ProjectionA);
float3 PositionVS = ViewRay * linearDepth;
float4 PositionWS = mul(float4(PositionVS, 1.0f), InverseView);
float4 texcoord = mul(PositionWS, LightInverseViewProjection);
texcoord.x = ((texcoord.x / texcoord.w) * 0.5f ) + 0.5f;
texcoord.y = ((texcoord.y / texcoord.w) * -0.5f ) + 0.5f;
float shadowdepth = ShadowMap.Sample(PointSampler, texcoord.xy);
float offset = 0.002f;
float shadowFactor = (texcoord.z < length(shadowdepth) + offset);
return shadowFactor;
}
Edited by lipsryme, 03 January 2013 - 07:16 AM.
Student at the Games-Academy Frankfurt, Germany.