160 likes | 265 Views
GAM532 DPS932 – Week 8. Texture Shadow Implementation. Depth Texture Shadows Basics. Compare depth from light’s depth target to each fragment. Render Scene from main camera for each light. Render scene d epth from each l ight. Binding Light Camera Values. struct Light {
E N D
GAM532DPS932 – Week 8 Texture Shadow Implementation
Depth Texture Shadows Basics Compare depth from light’s depth target to each fragment Render Scene from main camera for each light Render scene depth from each light
Binding Light Camera Values struct Light { float4 diffuse; float4 specular; float3 attenuation; float3 spot; }; Texture2D shadowTex : register(t0); SamplerStateshadowSamp : register(s0); Bind each shadow camera to a depth target (no color needed) Render scene depth from each light Bind each depth target to a slot in the shader
Bridging the Gap Shadow Camera’s Clip-To-Texture Space Main Camera’s View Space Read from texture bound to shadow camera Rendering scene from the main camera Must find a way to transform from one space to the next
What We Need To Find FragPos * InvLightMat Main Camera’s View Space Fragment Position Shadow Camera’s View Space Fragment Position Main Camera’s View Space Fragment Position Main Camera’s View Space Light Transformation Inverse
Inversion of Orthographic Matrices Transpose Rotation - Translation Inverse Translation + Identity | 0 0 -1 0 | | 1 0 00 | | 0 1 0 0 | | 0 0 0 1 | | 1 0 0 0 | | 0 1 0 0 | | 0 0 1 0 | | 8 -9 -3 1 | | 0 1 0 0 | | 0 0 1 0 | | -1 0 0 0 | | -8 9 3 1 | = | 0 0 -1 0 | | 1 0 0 0 | | 0 1 0 0 | | -9 -3 -8 1 | * Inverse Rotational Matrix Origin Orthographic Matrix Inverse Translation Matrix Inverse Orthographic Matrix
From View Space to Clip Space struct Light { float4x4 shadowProjection; float4 diffuse; float4 specular; float3 attenuation; float3 spot; }; Texture2D shadowTex : register(t0); SamplerStateshadowSamp : register(s0); Shadow Camera’s View Space Fragment Position Shadow Camera Projection Transformation FragPos * shadowProjection
Clip Space To Texture Coordinate Screen Coordinates [ 23 12 29 31 ] 0 [ 0.74 -0.39 0.94 ] [ 0.74 -0.39 0.94 ] X Y Depth U V Depth -1 [ x/w y/w z/w w/w] -1 1 1 0 [ x/2+0.5 y/2+0.5 z ] 1 [ 0.74 -0.39 0.94 1 ] 1 [ 0.87 0.31 0.94 ] Shadow Camera’s Clip Space Fragment Position Texture Coordinates of Fragment with Depth Screen Coordinates of Fragment with Depth Texture Coordinates
Testing Depth The light hit a different object first, shadow casted on fragment, fragment is not lit Yes 0.87 [ 0.87 0.31 0.94 ] U V Depth Is sampled depth lower than the calculated depth of the fragment? 0.31 The light hit the surface of the object, no shadow casted on fragment, fragment is lit No Texture Coordinates of Fragment with Depth Sample Depth from Shadow Texture
Adding All Lights Together Each light contributes to an object Shadows only block one light Single object can project many shadows + + =
Final Result High Detail (texture limited) Dynamically changing Shadow Self Shadowing Translucency effects easily added Expensive (re-render scene for each light) Detail limited by texture size Point lights are very expensive to cast shadows from (6 renders per light)
Shadow Texture Notes Point lights require up to 6 shadow textures to map out (don’t do it) Point and spot lights radiate light in many directions Directional lights work in one direct and require an orthographic camera
Depth Fighting Shadow Acne Floating point precision issue 0.94534 > 0.94522 0.945341458 > 0.945341456 0.945341458458??? > 0.945341458458??? 0.945341458458??? + 0.0000001 > 0.945341458458??? Shadow Acne No Acne
Alias Reduction float2 poissonDisk[4] = { float2(-0.94201624, -0.39906216), float2(0.94558609, -0.76890725), float2(-0.094184101, -0.92938870), float2(0.34495938, 0.29387760) ); for (inti=0; i<4; i++) { if(texture2D(shadowTex, shadow.xy+ poissonDisk[i]/700.0).z<ShadowCoord.z-bias ){ visibility-=0.2; } } Sampling adjacent texels and blending can soften shadows Texture resolution can cause aliasing
Graphics Section Complete Audio Next…
To Do • Begin work on your enhancement • Begin work on OpenGL labs • Prepare for Mid-term (for real this time, I’m not pushing back again)