- Timestamp:
- 09/01/08 08:58:38 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/App/Demos/Vis/FriendlyCulling/src/shaders/shadow.cg
r2882 r2891 1 //---------------------------------------------------------------------------------- 2 // File: shadow_single_fragment.glsl 3 // Author: Rouslan Dimitrov 4 // Email: sdkfeedback@nvidia.com 5 // Cascaded shadows maps, single shadow sample 6 // Copyright (c) NVIDIA Corporation. All rights reserved. 7 //---------------------------------------------------------------------------------- 8 #version 120 9 #extension GL_EXT_texture_array : enable 1 struct appdata { 2 float3 Position : POSITION; 3 float3 Normal : NORMAL; 4 }; 10 5 11 uniform sampler2D tex;12 uniform vec4 far_d;13 6 14 varying vec4 vPos; 7 struct vpconn { 8 float4 Hposition : POSITION; 9 float4 TexCoord0 : TEXCOORD0; 10 float4 TexCoord1 : TEXCOORD1; 11 float4 Color0 : COLOR0; 12 }; 15 13 16 uniform sampler2DArray stex; 17 float shadowCoef() 14 15 vpconn main(appdata IN, 16 uniform float4x4 WorldViewProj, 17 uniform float4x4 TexTransform, 18 uniform float3x3 WorldIT, 19 uniform float3 LightVec) 18 20 { 19 int index = 3;21 vpconn OUT; 20 22 21 // find the appropriate depth map to look up in based on the depth of this fragment 22 if(gl_FragCoord.z < far_d.x) 23 index = 0; 24 else if(gl_FragCoord.z < far_d.y) 25 index = 1; 26 else if(gl_FragCoord.z < far_d.z) 27 index = 2; 23 float3 worldNormal = normalize(mul(WorldIT, IN.Normal)); 28 24 29 // transform this fragment's position from view space to scaled light clip space 30 // such that the xy coordinates are in [0;1] 31 // note there is no need to divide by w for othogonal light sources 32 vec4 shadow_coord = gl_TextureMatrix[index]*vPos; 33 34 shadow_coord.w = shadow_coord.z; 25 float ldotn = max(dot(LightVec, worldNormal), 0.0); 26 OUT.Color0.xyz = ldotn.xxx; 35 27 36 // tell glsl in which layer to do the look up 37 shadow_coord.z = float(index); 28 float4 tempPos; 29 tempPos.xyz = IN.Position.xyz; 30 tempPos.w = 1.0; 38 31 39 // get the stored depth40 float shadow_d = texture2DArray(stex, shadow_coord.xyz).x;32 OUT.TexCoord0 = mul(TexTransform, tempPos); 33 OUT.TexCoord1 = mul(TexTransform, tempPos); 41 34 42 // get the difference of the stored depth and the distance of this fragment to the light 43 float diff = shadow_d - shadow_coord.w; 35 OUT.Hposition = mul(WorldViewProj, tempPos); 44 36 45 // smoothen the result a bit, to avoid aliasing at shadow contact point 46 return clamp( diff*250.0 + 1.0, 0.0, 1.0); 37 return OUT; 47 38 } 48 39 49 void main() 40 41 struct v2f_simple { 42 float4 Hposition : POSITION; 43 float4 TexCoord0 : TEXCOORD0; 44 float4 TexCoord1 : TEXCOORD1; 45 float4 Color0 : COLOR0; 46 }; 47 48 49 float4 main(v2f_simple IN, 50 uniform sampler2D ShadowMap, 51 uniform sampler2D SpotLight) : COLOR 50 52 { 51 const float shadow_ambient = 0.9; 52 vec4 color_tex = texture2D(tex, gl_TexCoord[0].st); 53 float shadow_coef = shadowCoef(); 54 float fog = clamp(gl_Fog.scale*(gl_Fog.end + vPos.z), 0.0, 1.0); 55 gl_FragColor = mix(gl_Fog.color, (shadow_ambient * shadow_coef * gl_Color * color_tex + (1.0 - shadow_ambient) * color_tex), fog); 53 float4 shadow = tex2D(ShadowMap, IN.TexCoord0.xy); 54 float4 spotlight = tex2D(SpotLight, IN.TexCoord1.xy); 55 float4 lighting = IN.Color0; 56 return shadow * spotlight * lighting; 56 57 }
Note: See TracChangeset
for help on using the changeset viewer.