Ignore:
Timestamp:
09/01/08 08:58:38 (16 years ago)
Author:
mattausch
Message:
 
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 
     1struct appdata { 
     2        float3 Position : POSITION; 
     3        float3 Normal : NORMAL; 
     4}; 
    105 
    11 uniform sampler2D tex; 
    12 uniform vec4 far_d; 
    136 
    14 varying vec4 vPos; 
     7struct vpconn { 
     8        float4 Hposition : POSITION; 
     9        float4 TexCoord0 : TEXCOORD0; 
     10        float4 TexCoord1 : TEXCOORD1; 
     11        float4 Color0 : COLOR0; 
     12}; 
    1513 
    16 uniform sampler2DArray stex; 
    17 float shadowCoef() 
     14 
     15vpconn main(appdata IN, 
     16                        uniform float4x4 WorldViewProj, 
     17                        uniform float4x4 TexTransform, 
     18                        uniform float3x3 WorldIT, 
     19                        uniform float3 LightVec) 
    1820{ 
    19         int index = 3; 
     21        vpconn OUT; 
    2022         
    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)); 
    2824         
    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; 
    3527         
    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; 
    3831         
    39         // get the stored depth 
    40         float shadow_d = texture2DArray(stex, shadow_coord.xyz).x; 
     32        OUT.TexCoord0 = mul(TexTransform, tempPos); 
     33        OUT.TexCoord1 = mul(TexTransform, tempPos); 
    4134         
    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); 
    4436         
    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; 
    4738} 
    4839 
    49 void main() 
     40 
     41struct v2f_simple { 
     42        float4 Hposition : POSITION; 
     43        float4 TexCoord0 : TEXCOORD0; 
     44        float4 TexCoord1 : TEXCOORD1; 
     45        float4 Color0 : COLOR0; 
     46}; 
     47 
     48 
     49float4 main(v2f_simple IN, 
     50                        uniform sampler2D ShadowMap, 
     51                        uniform sampler2D SpotLight) : COLOR 
    5052{ 
    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; 
    5657} 
Note: See TracChangeset for help on using the changeset viewer.