source: GTP/trunk/App/Demos/Illum/Ogre/Media/Station/StationBase.hlsl @ 2474

Revision 2474, 7.2 KB checked in by szirmay, 17 years ago (diff)
Line 
1//#define VARIANCE_SHADOW_MAPPING
2#define MAX_LIGHT 2
3#define MAX_CAU_CASTER 2
4#define HIGH_QUALITY
5
6struct Shaded_OUT
7{
8 float4 vPos : POSITION;
9 float4 wNormal : TEXCOORD0;
10 float4 wPos    : TEXCOORD1;
11};
12
13Shaded_OUT MorphedSphere_VS(float4 position : POSITION,
14                     float4 normal : NORMAL,
15                     float2 texCoord : TEXCOORD0,
16                     uniform float4x4 WorldViewProj,
17                     uniform float4x4 World,
18                     uniform float4x4 WorldInv,
19                     uniform float t)
20{
21 Shaded_OUT OUT;
22 
23 float dist = sin(t + position.x * position.y * 5.0 + position.z) * 0.3;
24 float3 dist2 = sin(t + position.x * position.y * 5.0 + position.z + float3(0.005,0.005,0.001)) * 0.3;
25 
26 float3 pos2 = (position + float3(0.001,0.001,0.001));
27 pos2 += normalize(pos2) * dist;
28 position.xyz += normalize(position.xyz) * dist;
29 
30 normal.xyz = cross(cross(normalize(pos2 - position.xyz), normal.xyz), normalize(pos2 - position.xyz));
31 if(length(normal.xyz < 0.01))
32        normal = position;
33       
34 OUT.vPos = mul(WorldViewProj, position);
35 
36 OUT.wPos = mul(World, position);
37 OUT.wNormal = mul(normal, WorldInv);
38 return OUT;
39}
40
41struct CPos_OUT
42{
43        float4 VPos : POSITION;
44        float4 CPos : TEXCOORD0;
45};
46
47#ifdef HIGH_QUALITY
48       
49        CPos_OUT MorphedSphereSM_VS(float4 position : POSITION,
50                      uniform float4x4 WorldViewProj,
51                      uniform float4x4 WorldView,
52                      uniform float t)
53        {
54         CPos_OUT OUT;
55         float dist = sin(t + position.x * position.y * 5.0 + position.z) * 0.3;
56         position.xyz += normalize(position.xyz) * dist;
57         
58         OUT.VPos = mul(WorldViewProj, position);
59         OUT.CPos = mul(WorldView, position);
60         return OUT;
61        }
62       
63        float4 MorphedSphereSM_PS(CPos_OUT IN,
64                                uniform float farPlane) : COLOR
65        {
66                float dist = length(IN.CPos.xyz) / farPlane;
67                return float4(dist, dist * dist, 1, dist);     
68        }
69       
70#else
71
72        struct VPos_OUT
73        {
74         float4 VPos : POSITION;
75         float4 VPosition : TEXCOORD0;
76        };
77       
78        VPos_OUT MorphedSphereSM_VS(float4 position : POSITION,
79                      uniform float4x4 WorldViewProj,
80                      uniform float t)
81        {
82         VPos_OUT OUT;
83         float dist = sin(t + position.x * position.y * 5.0 + position.z) * 0.3;
84         position.xyz += normalize(position.xyz) * dist;
85         OUT.VPos = OUT.VPosition = mul(WorldViewProj, position);
86         return OUT;
87        }
88       
89        float4 MorphedSphereSM_PS(VPos_OUT IN) : COLOR
90        {
91         float4 pos = IN.VPosition / IN.VPosition.w;
92         return float4(pos.z, 0, 0, 1);
93        }
94
95#endif
96       
97CPos_OUT MorphedSphereCDepth_VS(float4 position : POSITION,
98                      uniform float4x4 WorldViewProj,
99                      uniform float4x4 WorldView,
100                      uniform float t)
101{
102        CPos_OUT OUT;
103        float dist = sin(t + position.x * position.y * 5.0 + position.z) * 0.3;
104        position.xyz += normalize(position.xyz) * dist;
105        OUT.VPos = mul(WorldViewProj, position);
106        OUT.CPos = mul(WorldView, position);
107        return OUT;
108}
109
110#include "stationIllum.hlsl"
111
112uniform sampler2D colorTexture : register(s0);
113uniform sampler2D obscuranceTexture : register(s1);
114uniform sampler2D PathMap : register(s2);
115uniform sampler2D WeightIndexMap : register(s3);
116uniform sampler2D WeightMap : register(s4);
117uniform samplerCUBE ShadowMap1Point : register(s5);
118uniform samplerCUBE ShadowMap2Point : register(s6);
119uniform sampler2D ShadowMap1 : register(s5);
120uniform sampler2D ShadowMap2 : register(s6);
121uniform samplerCUBE CausticCubeMap  : register(s7);
122uniform samplerCUBE CausticCasterDepthMap  : register(s8);
123
124uniform float4x4 WorldViewProj;
125uniform float4x4 World;
126uniform float4x4 WorldI;
127
128uniform float3 wCamPos;
129
130uniform float4 wLightPos1;
131uniform float4 wLightPos2;
132uniform float4 lightRange1;
133uniform float4 lightRange2;
134uniform float lightPower1;
135uniform float lightPower2;
136uniform float4 lightColor1;
137uniform float4 lightColor2;
138uniform float3 wLightDir1;
139uniform float3 wLightDir2;
140                                               
141uniform float4x4 LightViewProj1;
142uniform float4x4 LightViewProj2;
143uniform float4x4 LightView1;
144uniform float4x4 LightView2;
145uniform float lightFarPlane1;
146uniform float lightFarPlane2;
147
148uniform float specularity;
149uniform float4 specularColor;
150
151uniform float causticReceiver;
152uniform float3 causticCasterCenter1;
153uniform float causticAttenuationRange1;
154
155struct STATION_BASE_VSOUT
156{
157        float4 hPos : POSITION;
158        float2 texCoord           : TEXCOORD0;
159        float3 wView              : TEXCOORD1;
160        float3 wNormal            : TEXCOORD2;
161        float3 wPos                       : TEXCOORD3; 
162        float4 lightVPos1         : TEXCOORD4;
163        float4 lightVPos2         : TEXCOORD5;
164        float3 lightCPos1         : TEXCOORD6;
165        float3 lightCPos2         : TEXCOORD7;
166};
167
168STATION_BASE_VSOUT StationBase_VS(float4 position :POSITION,
169                                                                                float3 normal :NORMAL,
170                                                                                float2 texCoord : TEXCOORD0     )
171{
172        STATION_BASE_VSOUT OUT = (STATION_BASE_VSOUT) 0;
173       
174        OUT.texCoord = texCoord;       
175               
176        OUT.hPos = mul(WorldViewProj, position);
177        OUT.wPos = mul(World, position);
178       
179        OUT.wView = wCamPos - OUT.wPos;
180       
181        OUT.wNormal = normalize(mul(float4(normal, 1),WorldI)).xyz;     
182       
183        OUT.lightVPos1 = mul(LightViewProj1, float4(OUT.wPos,1));
184        OUT.lightVPos2 = mul(LightViewProj2, float4(OUT.wPos,1));
185
186#ifdef HIGH_QUALITY     
187        OUT.lightCPos1 = mul(LightView1, float4(OUT.wPos,1)).xyz;
188        OUT.lightCPos2 = mul(LightView2, float4(OUT.wPos,1)).xyz;
189#endif
190               
191        return OUT;
192}
193
194float4 StationBase_PS(STATION_BASE_VSOUT IN):COLOR0
195{       
196        float4 Color = 0;
197        float3 N = normalize(IN.wNormal);
198        float dist = length(IN.wView);
199        float3 V = IN.wView / dist;
200        // read textures
201        float4 diffuseColor = tex2D(colorTexture, IN.texCoord);
202        float4 obscurancescolor = tex2D(obscuranceTexture, IN.texCoord);
203        float4 combinedColor = diffuseColor * obscurancescolor;
204       
205        //----------------------------------------------------------------------------------------------------------------
206        //light1               
207                //light dir
208        float3 L;
209        float4 col;
210        float3 lightCPos = 0;
211        float4 lightVPos = 0;
212        float shadow;
213       
214        //if( dot(lightRange1, lightRange1) != 0)
215        {
216                L = wLightPos1.xyz - IN.wPos;
217                //illumination
218                col = Illumination(N, L, V, lightColor1 * lightPower1, lightRange1, normalize(wLightDir1), combinedColor, specularity, specularColor);
219                lightVPos = IN.lightVPos1;
220                lightCPos = IN.lightCPos1;
221                shadow = shadowMap(ShadowMap1, lightVPos, lightCPos, lightFarPlane1);
222               
223                Color += col * shadow;                 
224        }
225       
226        //----------------------------------------------------------------------------------------------------------------
227        //light2                       
228        if( dot(lightRange2, lightRange2) != 0 )
229        {
230                //light dir
231                L = wLightPos2.xyz - IN.wPos;
232                //illumination
233                col = Illumination(N, L, V, lightColor2 * lightPower2, lightRange2, normalize(wLightDir2), combinedColor, specularity, specularColor);
234               
235                lightVPos = IN.lightVPos2;
236                lightCPos = IN.lightCPos2;
237                shadow = shadowMap(ShadowMap2, lightVPos, lightCPos, lightFarPlane2);
238                Color += col * shadow;         
239        }
240       
241        //do Path Map to gather indirect illumination
242       
243        float4 indirect = PathMapIndirect(PathMap, WeightIndexMap, WeightMap, IN.texCoord);
244        indirect *= diffuseColor;
245        Color = Color + indirect;
246       
247        if(causticReceiver)
248        {
249                //Color *= 0.00000000001;
250                Color += diffuseColor * Caustics(CausticCubeMap, CausticCasterDepthMap, IN.wPos - causticCasterCenter1, causticAttenuationRange1);
251        }
252        //Color.a = dist;
253        return Color;
254}
Note: See TracBrowser for help on using the repository browser.