source: GTP/trunk/App/Demos/Illum/Ogre/Media/materials/programs/GameTools_HPS_Smoke_L_Depth.hlsl @ 1879

Revision 1879, 6.6 KB checked in by szirmay, 18 years ago (diff)
Line 
1#define method1
2
3struct VS_OUT
4{
5        float4 hPosition        : POSITION;
6        float4 cPosition        : TEXCOORD1;
7        float2 texCoord         : TEXCOORD0;
8        float r                         : TEXCOORD2;   
9        float4 center           : TEXCOORD3;
10        float4 Color            : TEXCOORD4;   
11        float2 screenCoord      : TEXCOORD5;
12};
13
14VS_OUT HPS_Smoke_L_Depth_VS (float4 position : POSITION,       
15                float4 texCoord : TEXCOORD0,
16                float4 Color: COLOR0,
17                uniform float baseRadius,
18                uniform float4x4 worldView,
19                uniform float4x4 Proj,
20                uniform float4x4 worldViewProj)
21{
22        VS_OUT OUT;
23        float2 offset = texCoord.zw * baseRadius;
24        OUT.r = abs(offset.x);
25        float4 cPosition;   
26        cPosition = mul(worldView, position);
27        OUT.center = cPosition;
28        cPosition.xy += offset;
29        OUT.cPosition = cPosition;
30        OUT.cPosition.z += baseRadius;
31        OUT.cPosition.z *= -1;
32       
33    OUT.hPosition = mul( Proj, cPosition );
34    float4 sPosition = OUT.hPosition / OUT.hPosition.w;
35    OUT.screenCoord = (sPosition.xy + float2(1, 1)) / 2.0;
36    OUT.screenCoord.y = 1.0 - OUT.screenCoord.y;
37     
38    OUT.texCoord = texCoord.xy; 
39    OUT.Color = Color; 
40        return OUT;
41}
42
43
44float4 HPS_Smoke_L_Depth_PS(VS_OUT IN,
45                                                uniform float4x4 Proj,
46                                                uniform sampler2D Texture  : register(s0),
47                                                uniform sampler2D depthTexture : register(s1),
48                                                uniform sampler2D illumVolume : register(s2),
49                                                uniform float farplane,
50                                                uniform float nearplane                                         
51                                                        ) : COLOR
52{
53        float4 Color = 0;
54        float4 impostor = tex2D(Texture, IN.texCoord);
55        float f = 1.0 - impostor.g;
56        float b = impostor.r;
57        float alpha = 0;
58       
59        if(b == 0)
60                discard;       
61
62        float sceneDepth = tex2D(depthTexture, IN.screenCoord).r;
63        if(sceneDepth == 0)
64                sceneDepth = farplane;
65           
66        float size = 2.0 * IN.r;
67        float frontDepth = IN.cPosition.z + size * (f - 0.5);
68        float backDepth = IN.cPosition.z +  size * (b - 0.5);
69       
70        float far = min(sceneDepth, backDepth);
71        float near = max(frontDepth, nearplane);
72       
73        alpha = (far - near) / (backDepth - frontDepth);
74        alpha = saturate(alpha) * impostor.a;
75       
76       
77        Color = float4(1, 1, 1, alpha) * IN.Color;
78    return Color;
79       
80}
81
82struct VS_OUT_ILLUM
83{
84        float4 hPosition        : POSITION;
85        float4 cPosition        : TEXCOORD1;
86        float2 texCoord         : TEXCOORD0;
87        float r                         : TEXCOORD2;   
88        float4 center           : TEXCOORD3;
89        float4 Color            : TEXCOORD4;   
90        float2 screenCoord      : TEXCOORD5;
91        float4 lightCoord       : TEXCOORD6;
92};
93
94VS_OUT_ILLUM HPS_Smoke_L_Depth_Illum_VS (float4 position : POSITION,   
95                float4 texCoord : TEXCOORD0,
96                float4 Color: COLOR0,
97                uniform float width,
98                uniform float height,
99                uniform float baseRadius,
100                uniform float4x4 worldView,
101                uniform float4x4 worldViewInv,
102                uniform float4x4 lightViewProj,
103                uniform float4x4 Proj,
104                uniform float4x4 worldViewProj)
105{
106        VS_OUT_ILLUM OUT;
107        //texCoord.z = normalize(texCoord.z);
108        //texCoord.w = normalize(texCoord.w);
109    float2 offset = texCoord.zw * baseRadius;
110        OUT.r = abs(offset.x);
111        float4 cPosition;   
112        cPosition = mul(worldView, position);
113        OUT.center = cPosition;
114        cPosition.xy += offset;
115        OUT.cPosition = cPosition;
116        OUT.cPosition.z *= -1;
117        //OUT.cPosition.z = OUT.cPosition.z - OUT.r;   
118       
119    OUT.hPosition = mul( Proj, cPosition );
120    float4 sPosition = OUT.hPosition / OUT.hPosition.w;
121    OUT.screenCoord = (sPosition.xy + float2(1.0, 1.0)) / float2(2.0, 2.0);
122    float2 halfpixel = float2(0.5 / width, 0.5 / height);
123    OUT.screenCoord += halfpixel;   
124    OUT.screenCoord.y = 1.0 - OUT.screenCoord.y;
125         
126    OUT.texCoord = texCoord.xy; 
127    OUT.Color = Color;
128    float4 wPosition = mul(worldViewInv, cPosition);
129    OUT.lightCoord = mul(lightViewProj, wPosition);
130        return OUT;
131}
132
133float ext(float z, sampler2D illumVolume, float2 lightCoord)
134{
135        float4 extintion = tex2D(illumVolume, lightCoord);
136       
137        float intensities[5];
138        intensities[0] = 1.0;
139        intensities[1] = extintion.r;
140        intensities[2] = extintion.g;
141        intensities[3] = extintion.b;
142        intensities[4] = extintion.a;
143       
144        z = 4.0 * z;
145        int start = floor(z);
146        return lerp( intensities[start], intensities[start + 1], z - ((float) start)); 
147}
148
149float4 HPS_Smoke_L_Depth_Illum_PS(VS_OUT_ILLUM IN,
150                                                uniform float4x4 Proj,
151                                                uniform sampler2D Texture  : register(s0),
152                                                uniform sampler2D depthTexture : register(s1),
153                                                uniform sampler2D illumVolume : register(s2),
154                                                uniform float farplane                                         
155                                                        ) : COLOR
156{
157        float4 Color = 0;
158        float4 impostor = tex2D(Texture, IN.texCoord);
159        float f = 1.0 - impostor.g;
160        float b = impostor.r;
161        float alpha = 0;
162       
163        if(b == 0)
164                discard;       
165
166        float sceneDepth = tex2D(depthTexture, IN.screenCoord).r;
167        if(sceneDepth == 0)
168        {
169                alpha = impostor.a;
170        }
171        else
172        {       
173                float size = 2.0 * IN.r;
174                float frontDepth = IN.cPosition.z + size * (f - 0.5);
175                float backDepth = IN.cPosition.z +  size * (b - 0.5);
176               
177                alpha = (sceneDepth - frontDepth) / (backDepth - frontDepth);
178                alpha = saturate(alpha) * impostor.a;
179        }
180       
181        float2 lightCoord;
182        lightCoord = (IN.lightCoord.xy + float2(1.0, 1.0)) / 2.0;
183        lightCoord.y = 1.0 - lightCoord.y;
184        float z = IN.lightCoord.z / IN.lightCoord.w;
185       
186#ifdef method1
187       
188                float4 extintion = tex2D(illumVolume, lightCoord);
189       
190                float intensities[5];
191                intensities[0] = 1.0;
192                intensities[1] = extintion.r;
193                intensities[2] = extintion.g;
194                intensities[3] = extintion.b;
195                intensities[4] = extintion.a;
196                       
197                float3 start;
198                float3 end;
199                float3 temp = 1.0;
200                float t;
201               
202                float4 planes = float4(0.33, 0.5, 0.66, 1);
203                if(z < planes.x)
204                {
205                        start = intensities[0];
206                        end = intensities[1];
207                        t = z / planes.x;
208                        temp = lerp(start, end, t);                             
209                }
210                if(z > planes.x && z < planes.y)
211                {
212                        start = intensities[1];
213                        end = intensities[2];
214                        t = (z - planes.x) / (planes.y - planes.x);
215                        temp = lerp(start, end, t);                                     
216                }
217                if(z > planes.y && z < planes.z)
218                {
219                        start = intensities[2];
220                        end = intensities[3];
221                        t = (z - planes.y) / (planes.z - planes.y);
222                        temp = lerp(start, end, t);                             
223                }
224                if(z > planes.z)
225                {
226                        start = intensities[3];
227                        end = intensities[4];
228                        t = (z - planes.z) / (planes.a - planes.z);
229                        temp = lerp(start, end, t);                                     
230                }
231                IN.Color.rgb *= temp;
232
233#else
234       
235        float4 extintion = tex3D(illumVolume, float3(lightCoord, z));
236        IN.Color.rgb *= extintion;
237        /*
238        float intensities[5];
239        intensities[0] = 1.0;
240        intensities[1] = extintion.r;
241        intensities[2] = extintion.g;
242        intensities[3] = extintion.b;
243        intensities[4] = extintion.a;
244       
245        z = 4.0 * z;
246        int start = floor(z);
247        float ext = lerp( intensities[start], intensities[start + 1], z - ((float) start));     
248        IN.Color.rgb *= ext;*/
249
250#endif
251       
252        Color = float4(1, 1, 1, alpha) * IN.Color;
253      return Color;
254       
255}
256
257
Note: See TracBrowser for help on using the repository browser.