1 | #define SHADOW_EPSILON 0.3f
|
---|
2 | #define reciproc 1.0f/512.0f
|
---|
3 | #define textureSize 256.0f
|
---|
4 | #define textureSize2 128.0f
|
---|
5 |
|
---|
6 | //Model view matrix
|
---|
7 | uniform float4x4 modelview;
|
---|
8 | //Model view inverse transpose matrix
|
---|
9 | uniform float4x4 modelviewIT;
|
---|
10 | //Model view projection matrix
|
---|
11 | uniform float4x4 modelviewproj;
|
---|
12 | //Shooter colors.
|
---|
13 | uniform float4 Lshoot; |
---|
14 | //Current number of iterations. |
---|
15 | uniform float niteration;
|
---|
16 | //The reciproc of resolution.
|
---|
17 | uniform float recres2;
|
---|
18 | //Random number.
|
---|
19 | uniform float RandomNum;
|
---|
20 | //The current search coordinates.
|
---|
21 | uniform float2 searchCoords;
|
---|
22 | //The first sum.
|
---|
23 | uniform float firstsum;
|
---|
24 | //The eye position.
|
---|
25 | uniform float3 eyePos;
|
---|
26 | //Py parameter.
|
---|
27 | uniform float py;
|
---|
28 | //Render full or half screen.
|
---|
29 | uniform bool fullScreen;
|
---|
30 | //The shininess parameter for specular.
|
---|
31 | uniform float shininess;
|
---|
32 |
|
---|
33 |
|
---|
34 | //Texture for the original visibility map.
|
---|
35 | texture visibility_map;
|
---|
36 | sampler VisMapSampler = sampler_state
|
---|
37 | {
|
---|
38 | Texture = <visibility_map>;
|
---|
39 | MinFilter = Point;
|
---|
40 | MagFilter = Point;
|
---|
41 | MipFilter = None;
|
---|
42 | //AddressU = Clamp;
|
---|
43 | //AddressV = Clamp;
|
---|
44 | };
|
---|
45 | //Texture for radiosity map.
|
---|
46 | texture radiosity_map;
|
---|
47 | sampler RadMapSampler = sampler_state
|
---|
48 | {
|
---|
49 | Texture = <radiosity_map>;
|
---|
50 | MinFilter = Point;
|
---|
51 | MagFilter = Point;
|
---|
52 | MipFilter = None;
|
---|
53 | //AddressU = Clamp;
|
---|
54 | //AddressV = Clamp;
|
---|
55 | };
|
---|
56 | //Texure for actual radiosity map.
|
---|
57 | texture act_radiosity_map;
|
---|
58 | sampler ActRadMapSampler = sampler_state
|
---|
59 | {
|
---|
60 | Texture = <act_radiosity_map>;
|
---|
61 | MinFilter = Point;
|
---|
62 | MagFilter = Point;
|
---|
63 | MipFilter = None;
|
---|
64 | //AddressU = Clamp;
|
---|
65 | //AddressV = Clamp;
|
---|
66 | };
|
---|
67 | //Texture for luminance.
|
---|
68 | texture luminance_map;
|
---|
69 | sampler LumMapSampler = sampler_state
|
---|
70 | {
|
---|
71 | Texture = <luminance_map>;
|
---|
72 | MinFilter = Point;
|
---|
73 | MagFilter = Point;
|
---|
74 | MipFilter = None;
|
---|
75 | //AddressU = Wrap;
|
---|
76 | //AddressV = Wrap;
|
---|
77 | };
|
---|
78 | //Texture for emission.
|
---|
79 | texture emission_map;
|
---|
80 | sampler EmissionMapSampler = sampler_state
|
---|
81 | {
|
---|
82 | Texture = <emission_map>;
|
---|
83 | MinFilter = Point;
|
---|
84 | MagFilter = Point;
|
---|
85 | MipFilter = None;
|
---|
86 | //AddressU = Clamp;
|
---|
87 | //AddressV = Clamp;
|
---|
88 | };
|
---|
89 | //Texture for the sum of the mipmap levels.
|
---|
90 | texture sum_map;
|
---|
91 | sampler SumSampler = sampler_state
|
---|
92 | {
|
---|
93 | Texture = <sum_map>;
|
---|
94 | MinFilter = Point;
|
---|
95 | MagFilter = Point;
|
---|
96 | MipFilter = None;
|
---|
97 | AddressU = Clamp;
|
---|
98 | AddressV = Clamp;
|
---|
99 | };
|
---|
100 | //Mipmap level texture
|
---|
101 | texture mipmap;
|
---|
102 | sampler MipmapSampler = sampler_state
|
---|
103 | {
|
---|
104 | Texture = <mipmap>;
|
---|
105 | MinFilter = Point;
|
---|
106 | MagFilter = Point;
|
---|
107 | MipFilter = None;
|
---|
108 | AddressU = Clamp;
|
---|
109 | AddressV = Clamp;
|
---|
110 | };
|
---|
111 | //The BRDF map.
|
---|
112 | texture BRDFMap;
|
---|
113 | sampler BRDFMapSampler = sampler_state
|
---|
114 | {
|
---|
115 | Texture = <BRDFMap>;
|
---|
116 | MinFilter = Linear;
|
---|
117 | MagFilter = Linear;
|
---|
118 | MipFilter = None;
|
---|
119 | AddressU = Clamp;
|
---|
120 | AddressV = Clamp;
|
---|
121 | };
|
---|
122 | //The specular map.
|
---|
123 | texture Specular_Map;
|
---|
124 | sampler SpecularMapSampler = sampler_state
|
---|
125 | {
|
---|
126 | Texture = <Specular_Map>;
|
---|
127 | MinFilter = Linear;
|
---|
128 | MagFilter = Linear;
|
---|
129 | MipFilter = None;
|
---|
130 | AddressU = Clamp;
|
---|
131 | AddressV = Clamp;
|
---|
132 | };
|
---|
133 |
|
---|
134 | //The map for the final rendered image.
|
---|
135 | texture final_map;
|
---|
136 | sampler FinalMapSampler = sampler_state
|
---|
137 | {
|
---|
138 | Texture = <final_map>;
|
---|
139 | MinFilter = Point;
|
---|
140 | MagFilter = Point;
|
---|
141 | MipFilter = None;
|
---|
142 | AddressU = Clamp;
|
---|
143 | AddressV = Clamp;
|
---|
144 | };
|
---|
145 |
|
---|
146 |
|
---|
147 | //Multiple render target PS output for 2 targets.
|
---|
148 | struct MRT_Output_2 {
|
---|
149 | float4 firstcolor : COLOR0;
|
---|
150 | float4 secondcolor : COLOR1;
|
---|
151 | };
|
---|
152 | //Vertex shader input structure.
|
---|
153 | struct inputs {
|
---|
154 | float4 position : POSITION;
|
---|
155 | float4 patch_index : COLOR0;
|
---|
156 | float2 texcoord : TEXCOORD0;
|
---|
157 | float3 brdf : TEXCOORD1;
|
---|
158 | float4 emission : TEXCOORD2;
|
---|
159 | float4 normal : NORMAL;
|
---|
160 | };
|
---|
161 | //Complex vertex shader output structure.
|
---|
162 | struct vs_outputs {
|
---|
163 | float4 hposition : POSITION;
|
---|
164 | float2 texcoord : TEXCOORD0;
|
---|
165 | float4 viscoord : TEXCOORD1;
|
---|
166 | float4 emission : TEXCOORD2;
|
---|
167 | float3 x : TEXCOORD3;
|
---|
168 | float3 brdf : TEXCOORD4;
|
---|
169 | float3 normal : TEXCOORD5;
|
---|
170 | };
|
---|
171 | //Simple vertex shader output for initializing BRDF maps.
|
---|
172 | struct text_vs_output{
|
---|
173 | float4 hposition:POSITION;
|
---|
174 | float2 texcoord:TEXCOORD0;
|
---|
175 | };
|
---|
176 |
|
---|
177 |
|
---|
178 | //Renders vertex output to a texture atlas.
|
---|
179 | text_vs_output BRDFMAP_VS(inputs IN){
|
---|
180 | text_vs_output OUT;
|
---|
181 | OUT.hposition.xy = 2*IN.texcoord.xy-float2(1,1);
|
---|
182 | OUT.hposition.z = 0;
|
---|
183 | OUT.hposition.w = 1;
|
---|
184 | OUT.texcoord.x = IN.texcoord.x+reciproc;
|
---|
185 | OUT.texcoord.y = 1-IN.texcoord.y+reciproc;
|
---|
186 | return(OUT);
|
---|
187 | }
|
---|
188 | //Pixel shader for BRDF atlas rendering.
|
---|
189 | float4 BRDFMAP_PS(float4 texcoord:TEXCOORD0):COLOR{
|
---|
190 | float4 retval;
|
---|
191 | retval.rgb=tex2D(BRDFMapSampler,texcoord).rgb/3.1415f;
|
---|
192 | retval.a=shininess;
|
---|
193 | return retval;
|
---|
194 | }
|
---|
195 |
|
---|
196 | //Renders visibility map.
|
---|
197 | vs_outputs ORIGVISMAP_VS( inputs IN) {
|
---|
198 |
|
---|
199 | vs_outputs OUT;
|
---|
200 |
|
---|
201 | OUT.hposition=float4(0.0f,0.0f,0.0f,0.0f);
|
---|
202 | OUT.texcoord=float2(0.0f,0.0f);
|
---|
203 | OUT.viscoord=float4(0.0f,0.0f,0.0f,0.0f);
|
---|
204 | OUT.emission=float4(0.0f,0.0f,0.0f,0.0f);
|
---|
205 | OUT.x =float3(0.0f,0.0f,0.0f);
|
---|
206 | OUT.brdf=float3(0.0f,0.0f,0.0f);
|
---|
207 | OUT.normal=float3(0.0f,0.0f,0.0f);
|
---|
208 | OUT.hposition.xy = 2*IN.texcoord.xy-float2(1,1);
|
---|
209 | OUT.hposition.z = 0;
|
---|
210 | OUT.hposition.w = 1;
|
---|
211 | OUT.emission.rgb = IN.patch_index.xyz;
|
---|
212 | OUT.emission.a = 1.0f;
|
---|
213 | OUT.viscoord=IN.emission.rgba;
|
---|
214 | return(OUT);
|
---|
215 | }
|
---|
216 |
|
---|
217 | //Renders emission map.
|
---|
218 | vs_outputs EMISSION_VS( inputs IN) {
|
---|
219 |
|
---|
220 | vs_outputs OUT;
|
---|
221 |
|
---|
222 | OUT.hposition=float4(0.0f,0.0f,0.0f,0.0f);
|
---|
223 | OUT.texcoord=float2(0.0f,0.0f);
|
---|
224 | OUT.viscoord=float4(0.0f,0.0f,0.0f,0.0f);
|
---|
225 | OUT.emission=float4(0.0f,0.0f,0.0f,0.0f);
|
---|
226 | OUT.x =float3(0.0f,0.0f,0.0f);
|
---|
227 | OUT.brdf=float3(0.0f,0.0f,0.0f);
|
---|
228 | OUT.normal=float3(0.0f,0.0f,0.0f);
|
---|
229 | OUT.hposition.xy = 2 * IN.texcoord.xy - float2(1, 1);
|
---|
230 | OUT.hposition.z = 0;
|
---|
231 | OUT.hposition.w = 1;
|
---|
232 | OUT.emission.rgba = IN.emission.rgba;
|
---|
233 | return(OUT);
|
---|
234 | }
|
---|
235 |
|
---|
236 |
|
---|
237 | //Renders iterated visibility map.
|
---|
238 | vs_outputs ITVIS_VS( inputs IN) {
|
---|
239 |
|
---|
240 | vs_outputs OUT;
|
---|
241 |
|
---|
242 | OUT.hposition=float4(0.0f,0.0f,0.0f,0.0f);
|
---|
243 | OUT.texcoord=float2(0.0f,0.0f);
|
---|
244 | OUT.viscoord=float4(0.0f,0.0f,0.0f,0.0f);
|
---|
245 | OUT.emission=float4(0.0f,0.0f,0.0f,0.0f);
|
---|
246 | OUT.x =float3(0.0f,0.0f,0.0f);
|
---|
247 | OUT.brdf=float3(0.0f,0.0f,0.0f);
|
---|
248 | OUT.normal=float3(0.0f,0.0f,0.0f);
|
---|
249 | OUT.hposition = mul(IN.position,modelviewproj);
|
---|
250 | OUT.emission.r = OUT.hposition.z;
|
---|
251 | OUT.emission.g = abs(dot(IN.normal,normalize(IN.position-eyePos))); //cosine
|
---|
252 | return(OUT);
|
---|
253 | }
|
---|
254 | //Vertex shader for rendering one shot from the current shooter.
|
---|
255 | vs_outputs SHOOT_VS( inputs IN) {
|
---|
256 |
|
---|
257 | vs_outputs OUT;
|
---|
258 |
|
---|
259 | OUT.hposition=float4(0.0f,0.0f,0.0f,0.0f);
|
---|
260 | OUT.texcoord=float2(0.0f,0.0f);
|
---|
261 | OUT.viscoord=float4(0.0f,0.0f,0.0f,0.0f);
|
---|
262 | OUT.emission=float4(0.0f,0.0f,0.0f,0.0f);
|
---|
263 | OUT.x =float3(0.0f,0.0f,0.0f);
|
---|
264 | OUT.brdf=float3(0.0f,0.0f,0.0f);
|
---|
265 | OUT.normal=float3(0.0f,0.0f,0.0f);
|
---|
266 | OUT.hposition.xy = 2 * IN.texcoord.xy - float2(1, 1);
|
---|
267 | OUT.hposition.z = 0;
|
---|
268 | OUT.hposition.w = 1;
|
---|
269 | OUT.texcoord.x = IN.texcoord.x+reciproc;
|
---|
270 | OUT.texcoord.y = 1-IN.texcoord.y+reciproc;
|
---|
271 |
|
---|
272 | OUT.x = mul(IN.position, modelview).xyz;
|
---|
273 | OUT.normal = mul(IN.normal, modelviewIT).xyz;
|
---|
274 |
|
---|
275 | OUT.emission.rgba = IN.emission.rgba;
|
---|
276 | OUT.brdf = IN.brdf;
|
---|
277 | OUT.viscoord = mul(IN.position,modelviewproj);
|
---|
278 | return OUT;
|
---|
279 | }
|
---|
280 | //Rendering the final output.
|
---|
281 | vs_outputs FINAL_VS( inputs IN) {
|
---|
282 |
|
---|
283 | vs_outputs OUT;
|
---|
284 |
|
---|
285 | OUT.hposition=float4(0.0f,0.0f,0.0f,0.0f);
|
---|
286 | OUT.texcoord=float2(0.0f,0.0f);
|
---|
287 | OUT.viscoord=float4(0.0f,0.0f,0.0f,0.0f);
|
---|
288 | OUT.emission=float4(0.0f,0.0f,0.0f,0.0f);
|
---|
289 | OUT.x =float3(0.0f,0.0f,0.0f);
|
---|
290 | OUT.brdf=float3(0.0f,0.0f,0.0f);
|
---|
291 | OUT.normal=float3(0.0f,0.0f,0.0f);
|
---|
292 |
|
---|
293 | OUT.hposition.xyzw = mul(IN.position,modelviewproj).xyzw;
|
---|
294 | OUT.texcoord.x = IN.texcoord.x;
|
---|
295 | OUT.texcoord.y = 1.0f-IN.texcoord.y;
|
---|
296 |
|
---|
297 | return OUT;
|
---|
298 | }
|
---|
299 |
|
---|
300 | //Rendering a shot from the current shooter. |
---|
301 | float4 SHOOT_PS( |
---|
302 | float2 texcoord : TEXCOORD0,
|
---|
303 | float4 viscoord : TEXCOORD1,
|
---|
304 | float4 emission : TEXCOORD2,
|
---|
305 | float3 x : TEXCOORD3,
|
---|
306 | float3 brdf : TEXCOORD4, |
---|
307 | float3 xnormal : TEXCOORD5 |
---|
308 | ) : COLOR |
---|
309 | { |
---|
310 |
|
---|
311 | float3 ytox = normalize( x ); // direction from y to x
|
---|
312 | float xydist2 = dot( x, x ); // |x - y|^2
|
---|
313 |
|
---|
314 | float costhetax = dot(xnormal, -ytox); //cosine(thetax)
|
---|
315 | if(costhetax<0.0f) costhetax=0.0f;
|
---|
316 |
|
---|
317 | float costhetay = (fullScreen) ? ytox.z : ytox.y; //cosine(thetay) is fullscreen side of the visibility hemicube?
|
---|
318 | if(costhetay<0.0f) costhetay=0.0f;
|
---|
319 | if(xydist2<1.0f) xydist2 = 1.0f;
|
---|
320 | float G = costhetax * costhetay / (xydist2+4.0f*Lshoot.w); //Geometry factor. Uniform disc method.
|
---|
321 |
|
---|
322 | float3 Lref = Lshoot.xyz * G;
|
---|
323 |
|
---|
324 |
|
---|
325 | float visible;
|
---|
326 |
|
---|
327 | float2 depthmap;
|
---|
328 |
|
---|
329 | float2 viscoord2=(viscoord.xy/viscoord.w+1)/2;
|
---|
330 | viscoord2.y=1-viscoord2.y+reciproc;
|
---|
331 | viscoord2.x+=reciproc;
|
---|
332 | float depth=viscoord.z;
|
---|
333 | float yLimit= (fullScreen)? 1 :0.5;
|
---|
334 | if((viscoord2.x>=0)&&(viscoord2.x<=1)&&(viscoord2.y>=0)&&(viscoord2.y<yLimit)){ |
---|
335 | depthmap = tex2D(VisMapSampler, viscoord2).rg;
|
---|
336 | |
---|
337 | visible = (abs(depthmap.r-depth)<(0.09-0.06*depthmap.g)); |
---|
338 | |
---|
339 | } |
---|
340 | else{ |
---|
341 | visible=0; |
---|
342 | } |
---|
343 | |
---|
344 | /* |
---|
345 | //V has is a normalized vector from patch to eye pos. |
---|
346 | //L is -ytox. |
---|
347 | //N is xnormal. |
---|
348 | //R is L mirrored to N. |
---|
349 | float4 brdf2=tex2D(BRDFSampler,texcoord); |
---|
350 | float3 eyePos2=normalize(x-eyePos); |
---|
351 | float3 R=xnormal*(2.0f*costhetax)+ytox; |
---|
352 | float cos_out=dot(R,eyePos2); |
---|
353 | //brdf2.a is specular shininess; |
---|
354 | float specular=0.1f*pow(cos_out,brdf2.a)/max(dot(xnormal,eyePos2),dot(xnormal,-ytox)); |
---|
355 | float3 lrNew= visible * Lref.xyz * (brdf2.xyz+specular); |
---|
356 | */ |
---|
357 | |
---|
358 | float3 lrNew= visible * Lref.xyz * brdf.xyz; |
---|
359 | |
---|
360 | |
---|
361 | float g; |
---|
362 | if(py==0.0f){ |
---|
363 | g=0.0f; |
---|
364 | } |
---|
365 | else{ |
---|
366 | g = G*visible/py; |
---|
367 | } |
---|
368 | |
---|
369 | float4 oldActual=tex2D(ActRadMapSampler,texcoord).rgba; |
---|
370 | |
---|
371 | float4 retColor=float4(lrNew,g)+oldActual.rgba; |
---|
372 | |
---|
373 | return retColor; |
---|
374 | |
---|
375 | |
---|
376 | }
|
---|
377 |
|
---|
378 | float4 TEXTURE_PS( in float2 texcoord : TEXCOORD0
|
---|
379 | ) : COLOR
|
---|
380 | {
|
---|
381 |
|
---|
382 | texcoord*=textureSize2;
|
---|
383 |
|
---|
384 | int2 itexcoord0=texcoord;
|
---|
385 |
|
---|
386 | float2 itexcoord1=float2(itexcoord0.x+1,itexcoord0.y);
|
---|
387 | float2 itexcoord2=float2(itexcoord0.x,itexcoord0.y+1);
|
---|
388 | float2 itexcoord3=float2(itexcoord0.x+1,itexcoord0.y+1);
|
---|
389 | float4 color0=tex2D(FinalMapSampler, itexcoord0/textureSize2).rgba;
|
---|
390 | float4 color1=tex2D(FinalMapSampler, itexcoord1/textureSize2).rgba;
|
---|
391 | float4 color2=tex2D(FinalMapSampler, itexcoord2/textureSize2).rgba;
|
---|
392 | float4 color3=tex2D(FinalMapSampler, itexcoord3/textureSize2).rgba;
|
---|
393 | color0*=(1-(texcoord.x-itexcoord0.x))*(1-(texcoord.y-itexcoord0.y));
|
---|
394 | color1*=((texcoord.x-itexcoord0.x))*(1-(texcoord.y-itexcoord0.y));
|
---|
395 | color2*=(1-(texcoord.x-itexcoord0.x))*((texcoord.y-itexcoord0.y));
|
---|
396 | color3*=((texcoord.x-itexcoord0.x))*((texcoord.y-itexcoord0.y));
|
---|
397 | if(color1.a!=0.0){
|
---|
398 | color0+=color1;
|
---|
399 |
|
---|
400 | }
|
---|
401 | if(color2.a!=0.0){
|
---|
402 | color0+=color2;
|
---|
403 |
|
---|
404 | }
|
---|
405 | if(color3.a!=0.0){
|
---|
406 | color0+=color3;
|
---|
407 | }
|
---|
408 |
|
---|
409 | return float4(color0.rgb/color0.a,1);
|
---|
410 |
|
---|
411 | }
|
---|
412 |
|
---|
413 | //Writes float4(TEXCOORD2.x,TEXCOORD2.y,TEXCOORD2.z,(sum(TEXCOORD2.x,TEXCOORD2.y,TEXCOORD2.z)*TEXCOORD2.w)) to the output.
|
---|
414 | float4 WRITETHROUGH_PS(in float4 emission : TEXCOORD2) : COLOR {
|
---|
415 | float lumPower=(emission.r+emission.g+emission.b)/3.0f*emission.a;
|
---|
416 | return(float4(emission.rgb,lumPower));
|
---|
417 | //return(float4(0,emission.a,0,1));
|
---|
418 | }
|
---|
419 |
|
---|
420 |
|
---|
421 | //Writes TEXCOORD2.r and TEXCOORD1.r to the output.
|
---|
422 | float4 ORIGVISMAP_PS( in float4 emission : TEXCOORD1,
|
---|
423 | in float4 patch_index : TEXCOORD2
|
---|
424 |
|
---|
425 | ) : COLOR {
|
---|
426 | return float4(patch_index.r,emission.a,0.0f,0.0f);
|
---|
427 | }
|
---|
428 | //Writes TEXCOORD2.r, TEXCOORD2.g to the output.
|
---|
429 | float4 WRITETHROUGH_VISMAP_PS(in float4 emission : TEXCOORD2) : COLOR {
|
---|
430 | return(float4(emission.r,emission.g,0,1));
|
---|
431 | }
|
---|
432 | //Creates the base level for the radiosity sum map.
|
---|
433 | float4 MIPMAP_CREATE_BASE( in float2 texcoord : TEXCOORD0,
|
---|
434 | in float4 color : COLOR0
|
---|
435 |
|
---|
436 | ) : COLOR
|
---|
437 | {
|
---|
438 |
|
---|
439 | float col=tex2D(RadMapSampler, float2(texcoord.x,texcoord.y)).a;
|
---|
440 | col+=tex2D(RadMapSampler, float2(texcoord.x+recres2, texcoord.y)).a;
|
---|
441 | col+=tex2D(RadMapSampler, float2(texcoord.x, texcoord.y+recres2)).a;
|
---|
442 | col+=tex2D(RadMapSampler, float2(texcoord.x+recres2, texcoord.y+recres2)).a;
|
---|
443 | return float4(col,0,0,0);
|
---|
444 | }
|
---|
445 | //Creates a sum map level.
|
---|
446 | float4 MIPMAP_CREATE_LEVEL( in float2 texcoord : TEXCOORD0,
|
---|
447 | in float4 color : COLOR0
|
---|
448 |
|
---|
449 | ) : COLOR
|
---|
450 | {
|
---|
451 |
|
---|
452 | float col=tex2D(LumMapSampler, float2(texcoord.x,texcoord.y)).r;
|
---|
453 | col+=tex2D(LumMapSampler, float2(texcoord.x+recres2, texcoord.y)).r;
|
---|
454 | col+=tex2D(LumMapSampler, float2(texcoord.x, texcoord.y+recres2)).r;
|
---|
455 | col+=tex2D(LumMapSampler, float2(texcoord.x+recres2, texcoord.y+recres2)).r;
|
---|
456 | return float4(col,0,0,0);
|
---|
457 | }
|
---|
458 |
|
---|
459 | //Starts the search of the sum map levels for a shooter.
|
---|
460 | float4 SEARCH_PS_START( in float2 texcoord : TEXCOORD0,
|
---|
461 | in float4 color : COLOR0
|
---|
462 |
|
---|
463 | ) : COLOR
|
---|
464 | {
|
---|
465 | //float3 sumColor=tex2D(SumSampler,float2(0.5f,0.5f));
|
---|
466 | float r=firstsum;
|
---|
467 | float color1=tex2D(MipmapSampler ,float2(0,0)).r;
|
---|
468 | float colMax=color1;
|
---|
469 | float colMin=0;
|
---|
470 | float retval=0;
|
---|
471 | float2 retCoords;
|
---|
472 | if(r<=colMax){
|
---|
473 | retval=r;
|
---|
474 | retCoords=float2(0,0);
|
---|
475 |
|
---|
476 | }
|
---|
477 | else{
|
---|
478 | colMin=colMax;
|
---|
479 | float color2=tex2D(MipmapSampler ,float2(searchCoords.x+recres2,searchCoords.y)).r;
|
---|
480 | colMax+=color2;
|
---|
481 | if(r<=colMax){
|
---|
482 | retval=r-colMin;
|
---|
483 | retCoords=float2(searchCoords.x+recres2,searchCoords.y);
|
---|
484 | }
|
---|
485 | else{
|
---|
486 | colMin=colMax;
|
---|
487 | float color3=tex2D(MipmapSampler ,float2(searchCoords.x,searchCoords.y+recres2)).r;
|
---|
488 | colMax+=color3;
|
---|
489 | if(r<=colMax){
|
---|
490 | retval=r-colMin;
|
---|
491 | retCoords=float2(searchCoords.x,searchCoords.y+recres2);
|
---|
492 | }
|
---|
493 | else{
|
---|
494 | colMin=colMax;
|
---|
495 | retval=r-colMin;
|
---|
496 | retCoords=float2(searchCoords.x+recres2,searchCoords.y+recres2);
|
---|
497 | }
|
---|
498 | }
|
---|
499 | }
|
---|
500 |
|
---|
501 | return float4(retval,retCoords.x,retCoords.y,1.0f);
|
---|
502 | }
|
---|
503 | //Searches the sum map levels for a shooter.
|
---|
504 | float4 SEARCH_PS( in float2 texcoord : TEXCOORD0,
|
---|
505 | in float4 color : COLOR0
|
---|
506 | ) : COLOR
|
---|
507 | {
|
---|
508 | float3 sumColor=tex2D(SumSampler,float2(0.5f,0.5f));
|
---|
509 |
|
---|
510 | float r=sumColor.r;
|
---|
511 | float2 searchCoords1=float2(sumColor.g,sumColor.b);
|
---|
512 | float color1=tex2D(MipmapSampler ,searchCoords1).r;
|
---|
513 | float colMax=color1;
|
---|
514 | float colMin=0;
|
---|
515 | float2 retCoords;
|
---|
516 | float retval=0;
|
---|
517 | if(r<=colMax){
|
---|
518 | retval=r;
|
---|
519 | retCoords=searchCoords1;
|
---|
520 | }
|
---|
521 | else{
|
---|
522 | colMin=colMax;
|
---|
523 | float color2=tex2D(MipmapSampler ,float2(searchCoords1.x+recres2,searchCoords1.y)).r;
|
---|
524 | colMax+=color2;
|
---|
525 | if(r<=colMax){
|
---|
526 | retval=r-colMin;
|
---|
527 | retCoords=float2(searchCoords1.x+recres2,searchCoords1.y);
|
---|
528 | }
|
---|
529 | else{
|
---|
530 | colMin=colMax;
|
---|
531 | float color3=tex2D(MipmapSampler ,float2(searchCoords1.x,searchCoords1.y+recres2)).r;
|
---|
532 | colMax+=color3;
|
---|
533 | if(r<=colMax){
|
---|
534 | retval=r-colMin;
|
---|
535 | retCoords=float2(searchCoords1.x,searchCoords1.y+recres2);
|
---|
536 | }
|
---|
537 | else{
|
---|
538 | colMin=colMax;
|
---|
539 | retval=r-colMin;
|
---|
540 | retCoords=float2(searchCoords1.x+recres2,searchCoords1.y+recres2);
|
---|
541 | }
|
---|
542 | }
|
---|
543 | }
|
---|
544 |
|
---|
545 | return float4(retval,retCoords.x,retCoords.y,1.0f);
|
---|
546 | }
|
---|
547 |
|
---|
548 |
|
---|
549 | //Ends the search for sum map levels for a shooter.
|
---|
550 | MRT_Output_2 SEARCH_PS_END( in float2 texcoord : TEXCOORD0,
|
---|
551 | in float4 color : COLOR0
|
---|
552 | )
|
---|
553 | {
|
---|
554 | MRT_Output_2 output1;
|
---|
555 | float3 sumColor=tex2D(SumSampler,float2(0.5f,0.5f));
|
---|
556 | float r=sumColor.r;
|
---|
557 | float2 searchCoords1=float2(sumColor.g,sumColor.b);
|
---|
558 | float retval=0;
|
---|
559 | float color1=tex2D(MipmapSampler ,searchCoords1).a;
|
---|
560 | float colMax=color1;
|
---|
561 | float colMin=0;
|
---|
562 | float2 retCoords;
|
---|
563 | if(r<=colMax){
|
---|
564 | retval=r;
|
---|
565 | retCoords=searchCoords1;
|
---|
566 | }
|
---|
567 | else{
|
---|
568 | colMin=colMax;
|
---|
569 | float color2=tex2D(MipmapSampler ,float2(searchCoords1.x+recres2,searchCoords1.y)).a;
|
---|
570 | colMax+=color2;
|
---|
571 | if(r<=colMax){
|
---|
572 | retval=r-colMin;
|
---|
573 | retCoords=float2(searchCoords1.x+recres2,searchCoords1.y);
|
---|
574 | }
|
---|
575 | else{
|
---|
576 | colMin=colMax;
|
---|
577 | float color3=tex2D(MipmapSampler ,float2(searchCoords1.x,searchCoords1.y+recres2)).a;
|
---|
578 | colMax+=color3;
|
---|
579 | if(r<=colMax){
|
---|
580 | retval=r-colMin;
|
---|
581 | retCoords=float2(searchCoords1.x,searchCoords1.y+recres2);
|
---|
582 | }
|
---|
583 | else{
|
---|
584 | colMin=colMax;
|
---|
585 | retval=r-colMin;
|
---|
586 | retCoords=float2(searchCoords1.x+recres2,searchCoords1.y+recres2);
|
---|
587 | }
|
---|
588 | }
|
---|
589 | }
|
---|
590 | float3 radiosityColor=tex2D(MipmapSampler,retCoords).rgb;
|
---|
591 | //The output is the value of the shooter. And the texture coordinates of the shooter.
|
---|
592 | output1.firstcolor=float4(retval,retCoords.x,retCoords.y,1.0f);
|
---|
593 | //The output is the value. And the texture coordinates of the shooter.
|
---|
594 | output1.secondcolor=float4(radiosityColor.r,radiosityColor.g,radiosityColor.b,1.0f);
|
---|
595 | return output1;
|
---|
596 | }
|
---|
597 |
|
---|
598 | //The vertex shader input structure for sum maping.
|
---|
599 | struct mipmap_inputs {
|
---|
600 | float4 position : POSITION;
|
---|
601 | float2 texcoord : TEXCOORD0;
|
---|
602 |
|
---|
603 | };
|
---|
604 | //The input structure for sum maping.
|
---|
605 | struct mipmap_outputs {
|
---|
606 | float4 hposition : POSITION;
|
---|
607 | float2 texcoord : TEXCOORD0;
|
---|
608 | };
|
---|
609 |
|
---|
610 | //Sum map vertex shader.
|
---|
611 | mipmap_outputs MIPMAP_VS(mipmap_inputs IN) {
|
---|
612 | mipmap_outputs OUT;
|
---|
613 | OUT.hposition.w=1;
|
---|
614 | OUT.hposition=IN.position;
|
---|
615 | OUT.texcoord=IN.texcoord;
|
---|
616 | return OUT;
|
---|
617 | }
|
---|
618 | //Averages the current radiosity map.
|
---|
619 | float4 AVERAGING_PS(mipmap_outputs IN):COLOR{
|
---|
620 | float4 retval;
|
---|
621 | float w=tex2D(RadMapSampler,IN.texcoord).a/3.1415f;
|
---|
622 | float3 retcolor=tex2D(RadMapSampler,IN.texcoord).rgb;
|
---|
623 | retcolor-=tex2D(EmissionMapSampler,IN.texcoord).rgb;
|
---|
624 | retcolor/=niteration;
|
---|
625 | retcolor+=tex2D(EmissionMapSampler,IN.texcoord).rgb;
|
---|
626 | retval = float4(retcolor,1);
|
---|
627 | return retval;
|
---|
628 | }
|
---|
629 |
|
---|
630 |
|
---|
631 |
|
---|
632 | //Vertex shader. Averages the actual radiosity mipmap.
|
---|
633 | text_vs_output ACTUAL_AVG_VS(inputs IN){
|
---|
634 | text_vs_output OUT;
|
---|
635 |
|
---|
636 | OUT.hposition.xy = 2*IN.texcoord.xy-float2(1,1);
|
---|
637 | OUT.hposition.z = 0;
|
---|
638 | OUT.hposition.w = 1;
|
---|
639 | OUT.texcoord.x = IN.texcoord.x+reciproc;
|
---|
640 | OUT.texcoord.y = 1-IN.texcoord.y+reciproc;
|
---|
641 | return OUT;
|
---|
642 | }
|
---|
643 |
|
---|
644 | //Pixel shader. Averages the actual radiosity mipmap.
|
---|
645 | float4 ACTUAL_AVG_PS(float2 texcoord:TEXCOORD0):COLOR{
|
---|
646 | float recres2=1.0f/textureSize;
|
---|
647 | float2 texcoord1=float2(texcoord.x+recres2,texcoord.y);
|
---|
648 | float2 texcoord2=float2(texcoord.x,texcoord.y+recres2);
|
---|
649 | float2 texcoord3=float2(texcoord.x+recres2,texcoord.y+recres2);
|
---|
650 |
|
---|
651 | float4 highResActual0=tex2D(ActRadMapSampler,texcoord);
|
---|
652 | float3 emission0=tex2D(EmissionMapSampler,texcoord).rgb;
|
---|
653 | float2 mask0=tex2D(VisMapSampler,texcoord).rg; //green channel contains area/texarea
|
---|
654 | highResActual0.rgb+=emission0.rgb;
|
---|
655 |
|
---|
656 | float4 highResActual1=tex2D(ActRadMapSampler,texcoord1);
|
---|
657 | float3 emission1=tex2D(EmissionMapSampler,texcoord1).rgb;
|
---|
658 | highResActual1.rgb+=emission1.rgb;
|
---|
659 | float2 mask1=tex2D(VisMapSampler,texcoord1).rg;
|
---|
660 |
|
---|
661 | float4 highResActual2=tex2D(ActRadMapSampler,texcoord2);
|
---|
662 | float3 emission2=tex2D(EmissionMapSampler,texcoord2).rgb;
|
---|
663 | highResActual2.rgb+=emission2.rgb;;
|
---|
664 | float2 mask2=tex2D(VisMapSampler,texcoord2).rg;
|
---|
665 |
|
---|
666 | float4 highResActual3=tex2D(ActRadMapSampler,texcoord3);
|
---|
667 | float3 emission3=tex2D(EmissionMapSampler,texcoord3).rgb;
|
---|
668 | highResActual3.rgb+=emission3.rgb;
|
---|
669 | float2 mask3=tex2D(VisMapSampler,texcoord3).rg;
|
---|
670 |
|
---|
671 |
|
---|
672 | float lNewLum=0;
|
---|
673 |
|
---|
674 | lNewLum+=(highResActual0.r+highResActual0.g+highResActual0.b)/3.0f*mask0.g;
|
---|
675 | lNewLum+=(highResActual1.r+highResActual1.g+highResActual1.b)/3.0f*mask1.g;
|
---|
676 | lNewLum+=(highResActual2.r+highResActual2.g+highResActual2.b)/3.0f*mask2.g;
|
---|
677 | lNewLum+=(highResActual3.r+highResActual3.g+highResActual3.b)/3.0f*mask3.g;
|
---|
678 |
|
---|
679 | return float4(lNewLum,0,0,0);
|
---|
680 | }
|
---|
681 | //Pixel shader. Masks the averaging output with the original visibility map. Keeps texture atlas
|
---|
682 | //pixels originally visible only.
|
---|
683 | float4 ACTUAL_AVG_PS2(float2 texcoord:TEXCOORD0):COLOR{
|
---|
684 | float recres2=1.0f/textureSize;
|
---|
685 | float2 texcoord1=float2(texcoord.x+recres2,texcoord.y);
|
---|
686 | float2 texcoord2=float2(texcoord.x,texcoord.y+recres2);
|
---|
687 | float2 texcoord3=float2(texcoord.x+recres2,texcoord.y+recres2);
|
---|
688 |
|
---|
689 | float4 highResActual0=tex2D(ActRadMapSampler,texcoord);
|
---|
690 | float mask0=tex2D(VisMapSampler,texcoord).r;
|
---|
691 | float4 highResActual1=tex2D(ActRadMapSampler,texcoord1);
|
---|
692 | float mask1=tex2D(VisMapSampler,texcoord1).r;
|
---|
693 |
|
---|
694 | float4 highResActual2=tex2D(ActRadMapSampler,texcoord2);
|
---|
695 | float mask2=tex2D(VisMapSampler,texcoord2).r;
|
---|
696 |
|
---|
697 | float4 highResActual3=tex2D(ActRadMapSampler,texcoord3);
|
---|
698 | float mask3=tex2D(VisMapSampler,texcoord3).r;
|
---|
699 |
|
---|
700 | float divisor=1.0f;
|
---|
701 |
|
---|
702 | float4 sum=highResActual0;
|
---|
703 |
|
---|
704 | if(mask0==mask1){
|
---|
705 | divisor++;
|
---|
706 | sum+=highResActual1;
|
---|
707 | }
|
---|
708 | if(mask0==mask2){
|
---|
709 | divisor++;
|
---|
710 | sum+=highResActual2;
|
---|
711 | }
|
---|
712 | if(mask0==mask3){
|
---|
713 | divisor++;
|
---|
714 | sum+=highResActual3;
|
---|
715 | }
|
---|
716 | sum/=divisor;
|
---|
717 |
|
---|
718 | return(tex2D(RadMapSampler,texcoord)+sum);
|
---|
719 | }
|
---|
720 |
|
---|
721 | // -------------------------------------------------------------
|
---|
722 | // Name technique | how to compile
|
---|
723 | // -------------------------------------------------------------
|
---|
724 |
|
---|
725 | technique OriginalVisibilityMapShader
|
---|
726 | {
|
---|
727 | pass P0
|
---|
728 | {
|
---|
729 | // compiler directives
|
---|
730 | VertexShader = compile vs_3_0 ORIGVISMAP_VS();
|
---|
731 | PixelShader = compile ps_3_0 ORIGVISMAP_PS();
|
---|
732 | }
|
---|
733 | }
|
---|
734 | technique EmissionMapTech
|
---|
735 | {
|
---|
736 | pass P0
|
---|
737 | {
|
---|
738 | // compiler directives
|
---|
739 | VertexShader = compile vs_3_0 EMISSION_VS();
|
---|
740 | PixelShader = compile ps_3_0 WRITETHROUGH_PS();
|
---|
741 | }
|
---|
742 | }
|
---|
743 | technique ITVisShader
|
---|
744 | {
|
---|
745 | pass P0
|
---|
746 | {
|
---|
747 | // compiler directives
|
---|
748 | VertexShader = compile vs_3_0 ITVIS_VS();
|
---|
749 | PixelShader = compile ps_3_0 WRITETHROUGH_VISMAP_PS();
|
---|
750 | }
|
---|
751 | }
|
---|
752 |
|
---|
753 | technique MipmapBaseCreate
|
---|
754 | {
|
---|
755 | pass P0{
|
---|
756 | Sampler[0] = (RadMapSampler);
|
---|
757 | // compiler directives
|
---|
758 | VertexShader = compile vs_3_0 MIPMAP_VS();
|
---|
759 | PixelShader = compile ps_3_0 MIPMAP_CREATE_BASE();
|
---|
760 | }
|
---|
761 | }
|
---|
762 | technique MipmapLevelCreate
|
---|
763 | {
|
---|
764 | pass P0{
|
---|
765 | Sampler[0] = (LumMapSampler);
|
---|
766 | // compiler directives
|
---|
767 | VertexShader = compile vs_3_0 MIPMAP_VS();
|
---|
768 | PixelShader = compile ps_3_0 MIPMAP_CREATE_LEVEL();
|
---|
769 | }
|
---|
770 | }
|
---|
771 | technique SearchStartTech
|
---|
772 | {
|
---|
773 | pass P0{
|
---|
774 | Sampler[0] = (MipmapSampler);
|
---|
775 | Sampler[1] = (SumSampler);
|
---|
776 | // compiler directives
|
---|
777 | VertexShader = compile vs_3_0 MIPMAP_VS();
|
---|
778 | PixelShader = compile ps_3_0 SEARCH_PS_START();
|
---|
779 | }
|
---|
780 | }
|
---|
781 | technique SearchTech
|
---|
782 | {
|
---|
783 | pass P0{
|
---|
784 |
|
---|
785 | Sampler[0] = (SumSampler);
|
---|
786 | Sampler[1] = (MipmapSampler);
|
---|
787 | // compiler directives
|
---|
788 | VertexShader = compile vs_3_0 MIPMAP_VS();
|
---|
789 | PixelShader = compile ps_3_0 SEARCH_PS();
|
---|
790 | }
|
---|
791 | }
|
---|
792 | technique SearchEndTech
|
---|
793 | {
|
---|
794 | pass P0{
|
---|
795 | /*
|
---|
796 | Sampler[0] = (SumSampler);
|
---|
797 | Sampler[1] = (MipmapSampler);
|
---|
798 | Sampler[2] = (RadMapSampler);
|
---|
799 | */
|
---|
800 | // compiler directives
|
---|
801 | VertexShader = compile vs_3_0 MIPMAP_VS();
|
---|
802 | PixelShader = compile ps_3_0 SEARCH_PS_END();
|
---|
803 | }
|
---|
804 | }
|
---|
805 | technique Shoot
|
---|
806 | {
|
---|
807 | pass P0{
|
---|
808 | Sampler[0] = (VisMapSampler);
|
---|
809 | Sampler[1] = (RadMapSampler);
|
---|
810 | // compiler directives
|
---|
811 | VertexShader = compile vs_3_0 SHOOT_VS();
|
---|
812 | PixelShader = compile ps_3_0 SHOOT_PS();
|
---|
813 | }
|
---|
814 | }
|
---|
815 | technique RadAveragingTech
|
---|
816 | {
|
---|
817 | pass P0{
|
---|
818 | // compiler directives
|
---|
819 | VertexShader = compile vs_3_0 MIPMAP_VS();
|
---|
820 | PixelShader = compile ps_3_0 AVERAGING_PS();
|
---|
821 | }
|
---|
822 | }
|
---|
823 | technique RenderFinal
|
---|
824 | {
|
---|
825 | pass P0{
|
---|
826 | Sampler[0] = (RadMapSampler);
|
---|
827 | // compiler directives
|
---|
828 | VertexShader = compile vs_3_0 FINAL_VS();
|
---|
829 | PixelShader = compile ps_3_0 TEXTURE_PS();
|
---|
830 | }
|
---|
831 | }
|
---|
832 | technique ActualAveragingTech
|
---|
833 | {
|
---|
834 | pass P0{
|
---|
835 | // compiler directives
|
---|
836 | VertexShader = compile vs_3_0 ACTUAL_AVG_VS();
|
---|
837 | PixelShader = compile ps_3_0 ACTUAL_AVG_PS();
|
---|
838 | }
|
---|
839 | }
|
---|
840 | technique ActualAveragingTech2
|
---|
841 | {
|
---|
842 | pass P0{
|
---|
843 | // compiler directives
|
---|
844 | VertexShader = compile vs_3_0 ACTUAL_AVG_VS();
|
---|
845 | PixelShader = compile ps_3_0 ACTUAL_AVG_PS2();
|
---|
846 | }
|
---|
847 | }
|
---|
848 | technique BRDFShader
|
---|
849 | {
|
---|
850 | pass P0{
|
---|
851 | // compiler directives
|
---|
852 | VertexShader = compile vs_3_0 BRDFMAP_VS();
|
---|
853 | PixelShader = compile ps_3_0 BRDFMAP_PS();
|
---|
854 | }
|
---|
855 | } |
---|