Download presentation
Presentation is loading. Please wait.
Published byRandall Eaton Modified over 9 years ago
1
GAM532 DPS932 – Week 8 Texture Shadow Implementation
2
Depth Texture Shadows Basics Render scene depth from each light Render Scene from main camera for each light Compare depth from light’s depth target to each fragment
3
Binding Light Camera Values Render scene depth from each light Bind each shadow camera to a depth target (no color needed) struct Light { float4 diffuse; float4 specular; float3 attenuation; float3 spot; }; Texture2D shadowTex : register(t0); SamplerState shadowSamp : register(s0); Bind each depth target to a slot in the shader
4
Bridging the Gap Rendering scene from the main camera Read from texture bound to shadow camera Must find a way to transform from one space to the next Main Camera’s View Space Shadow Camera’s Clip-To-Texture Space
5
What We Need To Find 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 FragPos * InvLightMat
6
Inversion of Orthographic Matrices Origin Orthographic Matrix | 0 1 0 0 | | 0 0 1 0 | | -1 0 0 0 | | -8 9 3 1 | | 1 0 0 0 | | 0 1 0 0 | | 0 0 1 0 | | 8 -9 -3 1 | Inverse Translation Matrix Inverse Translation + Identity * | 0 0 -1 0 | | 1 0 0 0 | | 0 1 0 0 | | -9 -3 -8 1 | Inverse Orthographic Matrix = | 0 0 -1 0 | | 1 0 0 0 | | 0 1 0 0 | | 0 0 0 1 | Inverse Rotational Matrix Transpose Rotation - Translation
7
From View Space to Clip Space struct Light { float4x4 shadowProjection; float4 diffuse; float4 specular; float3 attenuation; float3 spot; }; Texture2D shadowTex : register(t0); SamplerState shadowSamp : register(s0); Shadow Camera’s View Space Fragment Position Shadow Camera Projection Transformation FragPos * shadowProjection
8
Clip Space To Texture Coordinate Shadow Camera’s Clip Space Fragment Position [ 23 12 29 31 ] [ x/w y/w z/w w/w] [ 0.74 -0.39 0.94 1 ] 1 1 Screen Coordinates 0 0 1 1 Texture Coordinates [ 0.74 -0.39 0.94 ] X Y Depth U V Depth Screen Coordinates of Fragment with Depth [ 0.74 -0.39 0.94 ] [ x/2+0.5 y/2+0.5 z ] [ 0.87 0.31 0.94 ] Texture Coordinates of Fragment with Depth
9
Testing Depth [ 0.87 0.31 0.94 ] U V Depth Texture Coordinates of Fragment with Depth 0.87 0.31 Sample Depth from Shadow Texture Is sampled depth lower than the calculated depth of the fragment? Yes No The light hit a different object first, shadow casted on fragment, fragment is not lit The light hit the surface of the object, no shadow casted on fragment, fragment is lit
10
Adding All Lights Together ++ = Each light contributes to an object Shadows only block one light Single object can project many shadows
11
Final Result Translucency effects easily added Expensive (re-render scene for each light) Self Shadowing Dynamically changing Shadow Detail limited by texture size High Detail (texture limited) Point lights are very expensive to cast shadows from (6 renders per light)
12
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
13
Depth Fighting Shadow Acne Shadow AcneNo Acne Floating point precision issue 0.94534 > 0.94522 0.945341458 > 0.945341456 0.945341458458??? > 0.945341458458??? 0.945341458458??? + 0.0000001 > 0.945341458458???
14
Alias Reduction Texture resolution can cause aliasing Sampling adjacent texels and blending can soften shadows float2 poissonDisk[4] = { float2(-0.94201624, -0.39906216), float2(0.94558609, -0.76890725), float2(-0.094184101, -0.92938870), float2(0.34495938, 0.29387760) ); for (int i=0; i<4; i++) { if(texture2D(shadowTex, shadow.xy + poissonDisk[i]/700.0).z<ShadowCoord.z-bias ){ visibility-=0.2; }
15
Graphics Section Complete Audio Next…
16
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)
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.