source: GTP/trunk/App/Demos/Illum/Ogre/Media/materials/programs/GameTools_Localized_EnvMap.hlsl @ 1724

Revision 1724, 13.2 KB checked in by szirmay, 18 years ago (diff)
Line 
1//metal:
2float3 n, k;    // R 700 nm, G 550 nm, B 435 nm
3float REDUCED_CUBEMAP_SIZE = 4;
4
5float3 F0;
6/*
7       
8        if (iWhichMetal == 1) { // copper       
9                n = float3(0.21f, 0.96f, 1.17f);       
10                k = float3(4.16f, 2.57f, 2.32f); }
11        else if (iWhichMetal == 2) { // gold
12                n = float3(0.16f, 0.35f, 1.6f);         
13                k = float3(3.98f, 2.71f, 1.92f); }
14        else if (iWhichMetal == 3) { // silver
15                n = float3(0.142f, 0.124f, 0.158f);     
16                k = float3(4.52f,  3.33f, 2.32f); }
17        else if (iWhichMetal == 4) { // alu
18                n = float3(1.83f, 0.96f, 0.577f);
19                k = float3(8.31f,  6.69f, 5.288f); }
20
21*/     
22
23float4 readCubeMap(samplerCUBE cm, float3 coord)               
24{
25        float4 color = texCUBE( cm, float3(coord.xy, - coord.z) );
26        color.a = 1;
27        return color;
28}
29
30float readDistanceCubeMap(samplerCUBE dcm, float3 coord)               
31{
32        float dist = texCUBE(dcm, float3(coord.xy, - coord.z)).r;
33        if(dist == 0) dist = 1000; ///sky
34        return dist;
35}
36
37
38
39#define LIN_ITERATIONCOUNT 6
40#define LIN_ITERATIONCOUNT_L0 5
41#define LIN_ITERATIONCOUNT_L1 5
42#define LIN_ITERATIONCOUNT_L2 3
43#define LIN_ITERATIONCOUNT_L3 1
44#define SECANT_ITERATIONCOUNT 2
45
46float3 Hit(float3 x, float3 R, samplerCUBE mp, float cameraDistance = 0)
47{
48        return R + 0.000000001 *x;
49        R = normalize(R);
50       
51        float3 Ra = abs(R);
52        float3 xa = abs(x);
53        float a = max(max(xa.x,xa.y),xa.z) /
54                          max(max(Ra.x,Ra.y),Ra.z);
55       
56        bool overshoot = false, undershoot = false;
57        float dp, dl = 0, ppp, llp;
58        float lR = readDistanceCubeMap(mp, R);
59        float3 p = R;
60       
61        /*
62        if(cameraDistance < 100)
63                LIN_ITERATIONCOUNT  = (float) LIN_ITERATIONCOUNT_L0;
64        else if(cameraDistance < 200)
65                LIN_ITERATIONCOUNT  = (float) LIN_ITERATIONCOUNT_L1;
66        else if(cameraDistance < 300)
67                LIN_ITERATIONCOUNT  = (float) LIN_ITERATIONCOUNT_L2;
68        else
69                LIN_ITERATIONCOUNT  = (float) LIN_ITERATIONCOUNT_L3;
70        */
71       
72        float dt = 1.0 / LIN_ITERATIONCOUNT;
73       
74        //linear iteration     
75        float t = 0;
76        while(t < 1.0 && !overshoot)
77        {
78                //if(!overshoot)
79                //{
80                        dp = a * t / (1 - t);
81                        p = x + R * dp;
82                        float dist = readDistanceCubeMap(mp, p);
83                        if(dist > 0)
84                        {
85                                ppp = length(p) / dist;
86                                if(ppp < 1)
87                                {
88                                        dl = dp;
89                                        llp = ppp;             
90                                        undershoot = true;             
91                                }
92                                else
93                                {
94                                        if (undershoot)
95                                           overshoot = true;
96                                }
97                        }
98                        else
99                                undershoot = false;
100                //}
101                t += dt;               
102        }
103       
104        if(overshoot)
105        {
106                float dnew;
107                for(int i = 0; i < SECANT_ITERATIONCOUNT; i++ )
108                {
109                        dnew = dl + (dp - dl) * (1 - llp) / (ppp - llp);       
110                           
111                        p = x + R * dnew;
112                        half pppnew = length(p) / readDistanceCubeMap(mp, p);
113                        if(pppnew < 1)
114                        {
115                                llp = pppnew;
116                                dl = dnew;
117                        }
118                        else
119                        {
120                                ppp = pppnew;
121                                dp = dnew;
122                        }
123                }       
124        }
125        else
126                p = float3(0,0,0);
127         
128        return p;
129}
130/*                     
131
132float3 Hit( float3 x, float3 R, samplerCUBE mp )
133{
134        //return R  + 0.00000000001 * x;
135        float rl = readDistanceCubeMap( mp, R);                         // |r|
136       
137        float ppp = length( x ) /  readDistanceCubeMap( mp, x);                 // |p|/|p’|
138        float dun = 0, pun = ppp, dov = 0, pov = 0;
139        float dl = rl * ( 1 - ppp );                                                    // eq. 2
140        float3 l = x + R * dl;                                                                  // ray equation
141
142        // iteration
143        for( int i = 0; i < 2; i++ )    // 2 !!!!!!!!!!!!!!!!!!!!!!!
144        {
145                float llp = length( l ) / readDistanceCubeMap( mp, l);          // |l|/|l’|
146                if ( llp < 0.999f )                                                                     // undershooting
147                {
148                        dun = dl; pun = llp;                                                    // last undershooting
149                        dl += ( dov == 0 ) ? rl * ( 1 - llp ) :                 // eq. 2
150                                ( dl - dov ) * ( 1 - llp ) / ( llp - pov );     // eq. 3
151                } else if ( llp > 1.001f )                                                      // overshooting
152                {
153                        dov = dl; pov = llp;                                                    // last overshooting
154                        dl += ( dl -dun ) * ( 1 - llp ) / ( llp - pun );// eq. 3
155                }
156                l = x + R * dl;                                                                         // ray equation
157        }
158        return l;                                                                                               // computed hit point
159}
160*/
161
162/*
163float3 Hit( float3 x, float3 R, samplerCUBE mp )
164{
165        float rl = readDistanceCubeMap( mp, R);                         // |r|
166       
167        float ppp = length( x ) /  readDistanceCubeMap( mp, x);                 // |p|/|p’|
168        float dun = 0, pun = ppp, dov = 0, pov = 0;
169        float dl = rl * ( 1 - ppp );                                                    // eq. 2
170        float3 l = x + R * dl;                                                                  // ray equation
171
172        // iteration
173        for( int i = 0; i < SECANT_ITERATIONCOUNT; i++ )
174        {
175                float llp = length( l ) / readDistanceCubeMap( mp, l);          // |l|/|l’|
176                if ( llp < 0.999f )                                                                     // undershooting
177                {
178                        dun = dl; pun = llp;                                                    // last undershooting
179                        dl += ( dov == 0 ) ? rl * ( 1 - llp ) :                 // eq. 2
180                                ( dl - dov ) * ( 1 - llp ) / ( llp - pov );     // eq. 3
181                } else if ( llp > 1.001f )                                                      // overshooting
182                {
183                        dov = dl; pov = llp;                                                    // last overshooting
184                        dl += ( dl -dun ) * ( 1 - llp ) / ( llp - pun );// eq. 3
185                }
186                l = x + R * dl;                                                                         // ray equation
187        }
188        return l;                                                                                               // computed hit point
189}
190*/
191
192void LocalizedVS(float4 position : POSITION,
193                out float3 wPos : TEXCOORD1,                           
194                float2 texCoord : TEXCOORD0,
195                out float2 otexCoord : TEXCOORD0,
196                float3 normal   : NORMAL,
197                out float3 mNormal  : TEXCOORD2,
198                out float4 hPos : POSITION,             
199                uniform float4x4 worldViewProj,
200                uniform float4x4 world,
201                uniform float4x4 worldI
202                )
203{
204 
205  hPos = mul(worldViewProj, position);
206  wPos = mul(world, position).xyz; 
207  mNormal = mul(normal, worldI); 
208  otexCoord = texCoord;
209}
210//////////////
211//Localized reflection
212//////////////
213void LocalizedPS(  float2 texCoord : TEXCOORD0,
214                float3 wPos     : TEXCOORD1,   
215                float3 mNormal  : TEXCOORD2,
216                uniform float3 cameraPos,
217                uniform samplerCUBE CubeMap : register(s0),
218                uniform samplerCUBE DistanceMap : register(s1),
219                uniform float3 lastCenter,
220                uniform float3 lightPosition,           
221                out float4 Color :COLOR0)
222{
223       
224        Color = float4(1,1,1,1);
225       
226        mNormal = normalize(mNormal);
227        float3 RR, TT; 
228        float3 mPos = wPos - lastCenter;
229        float3 V = normalize(wPos - cameraPos);
230        float3 R = /*normalize*/(reflect( V, mNormal));
231       
232        float3 T = refract(V, mNormal, 0.9);
233               
234        RR = R; TT = T;
235        //RR += 0.000001 * lastCenter.x;
236        RR = Hit(mPos, R, DistanceMap);
237        TT = Hit(mPos, T, DistanceMap);
238       
239        float4 reflectcolor = readCubeMap(CubeMap, RR );               
240        float4 refractcolor = readCubeMap(CubeMap, TT );               
241       
242        float cos_theta = -dot(V, mNormal);
243        float sFresnel = 0.1;
244        float F = (sFresnel + pow(1-cos_theta, 5.0f) * (1-sFresnel));
245   
246    float3 L = normalize(lightPosition - wPos);
247        float3 H = normalize(L+V);
248        float4 lighting = lit(dot(mNormal, L),dot(mNormal, H), 30);
249        Color = (F * reflectcolor + (1-F) * refractcolor) + lighting.z;
250}
251
252
253
254//////////////
255//Metal
256//////////////
257void LocalizedMetalPS(  float2 texCoord : TEXCOORD0,
258                float3 wPos     : TEXCOORD1,   
259                float3 mNormal  : TEXCOORD2,
260                uniform float3 cameraPos,
261                uniform samplerCUBE CubeMap : register(s0),
262                uniform samplerCUBE DistanceMap : register(s1),
263                uniform float3 lastCenter,
264                uniform float3 lightPosition,                           
265                out float4 Color :COLOR0)
266{
267       
268        Color = float4(1,1,1,1);
269       
270        mNormal = normalize(mNormal);
271        float3 newTexCoord;     
272        float3 mPos = wPos - lastCenter;
273        float3 V  = (wPos - cameraPos);
274        float cameraDistace = length(V);
275        V = normalize(V);
276        float3 R = normalize(reflect( V, mNormal));
277               
278        newTexCoord = R;       
279       
280        newTexCoord = Hit(mPos, R, DistanceMap);
281        /*if(dot(newTexCoord,newTexCoord) == 0)
282                Color = float4(0.5,0.5,0.5,1);
283        else*/
284        Color = readCubeMap(CubeMap, newTexCoord );     
285       
286        float ctheta_in = dot(mNormal,R);
287        float ctheta_out = dot(mNormal,-V);
288
289        float3 F = 0;
290       
291        // F,P,G számítása
292        if ( ctheta_in > 0 && ctheta_out > 0 )
293        {
294                float3 H = normalize(R - V);    // felezõvektor
295                float cbeta  = dot(H,R);               
296                //F = ( (n-1)*(n-1) + pow(1-cbeta,5) * 4*n + k*k) / ( (n+1)*(n+1) + k*k );
297                //float3 F0 = ((n-1)*(n-1) + k*k) / ( (n+1)*(n+1) + k*k );
298                //float3 F1 = float3(1.0f,1.0f,1.0f) - F0;
299                F = F0 + (1-F0)*pow(1-cbeta,5);
300        }       
301       
302        Color = Color * float4(F,1);   
303}
304//////////////
305//PhotonMap
306//////////////
307/*void PhotonMapPS(  float2 texCoord : TEXCOORD0,
308                float3 wPos     : TEXCOORD1,   
309                float3 mNormal  : TEXCOORD2,
310                uniform float3 cameraPos,
311                uniform samplerCUBE UVMap : register(s0),
312                uniform samplerCUBE DistanceMap : register(s1),
313                uniform float3 lastCenter,
314                out float4 Color :COLOR0)
315{
316       
317        Color = float4(1,1,1,1);
318       
319        mNormal = normalize(mNormal);
320        float3 newTexCoord;     
321        float3 mPos = wPos - lastCenter;
322        float3 V = normalize(wPos - cameraPos);
323        float3 R = normalize(reflect( V, mNormal));
324               
325        newTexCoord = R;       
326       
327        newTexCoord = Hit(mPos, R, DistanceMap);
328       
329        Color = readCubeMap(UVMap, newTexCoord );
330        //Color = float4(1,0,0,1);             
331}*/
332
333float4 PhotonMapCausticPS(  float2 texCoord : TEXCOORD0,
334                float3 wPos     : TEXCOORD1,   
335                float3 mNormal  : TEXCOORD2,
336                uniform float3 cameraPos,
337                uniform samplerCUBE DistanceMap : register(s0),
338                uniform float3 lastCenter):COLOR0
339{
340       
341        float4 Color = float4(1,1,1,1);
342       
343        mNormal = normalize(mNormal);
344        float3 newTexCoord;     
345        float3 mPos = wPos - lastCenter;
346        float3 V = normalize(wPos - cameraPos);
347               
348        float3 R = refract(V, mNormal, 0.85);           
349        //float3 R = V;
350        newTexCoord = R;       
351               
352        newTexCoord = Hit(mPos, R, DistanceMap);
353               
354        Color = float4(newTexCoord, 1);
355       
356        //Color = 0.0001 * Color +  float4(0,0,1,1);
357        //Color += 0.0001 * lastCenter.x;
358        if(dot(V,mNormal)>0)
359        {
360                Color = float4(1,0,0,0);               
361        }               
362        return Color;
363}
364
365
366
367/////////////////////
368///// Diffuse
369///////////////////
370
371float4 GetContibution(float3 L, float3 pos, float3 N, float3 V, samplerCUBE SmallEnvMapSampler, samplerCUBE DistanceEnvMapSampler)      // Phong-Blinn
372// L: a hossza lényeges (az egységkocka faláig ér)
373{
374    REDUCED_CUBEMAP_SIZE = 4;
375   
376        float kd = 0.3; // 0.3
377        float ks = 0;   // 0.5
378        float shininess = 10;
379       
380        float l = length(L);
381        L = normalize(L);
382
383        //dw
384        float dw = 4 / (REDUCED_CUBEMAP_SIZE*REDUCED_CUBEMAP_SIZE*l*l*l + 4/3.1416f);
385        //Lin
386        float4 Lin = readCubeMap(SmallEnvMapSampler, L);
387        //r
388        float doy = readDistanceCubeMap(DistanceEnvMapSampler, L);
389        float dxy = length(L * doy - pos);     
390
391        //dws
392        float dws = (doy*doy * dw) / (dxy*dxy*(1 - dw/3.1416f) + doy*doy*dw/3.1416f);   // localization:
393        //float dws = dw;
394       
395        //L = L * doy - pos;    // L: x->y, az objektumtól induljon, ne a középpontból
396        L = normalize(L);
397        float3 H = normalize(L + V);    // felezõvektor
398
399        float a = kd * max(dot(N,L),0) +
400                          ks * pow(max(dot(N,H),0), shininess); // diffuse + specular
401
402        // 1.: eddigi
403        //return Lin * a * dws;
404       
405        float ctheta_in = dot(N,L);
406        float ctheta_out = dot(N,V);   
407       
408        return Lin * a * dws;           
409}
410
411void DiffuseVS( float4 position : POSITION,
412                float3 normal : NORMAL,
413                float2 Tex : TEXCOORD0,
414                uniform float4x4 worldViewProj,
415                                uniform float4x4 world,
416                                //uniform float3 lastCenter,    //LI//
417                                out float4 hposition : POSITION,
418                out float2 oTex : TEXCOORD0,
419                out float3 Normal : TEXCOORD1,
420                out float3 pos : TEXCOORD2 )
421{
422        pos = /*lastCenter + 0.01 * */mul( world, position ).xyz;
423        Normal = normal;
424    oTex = Tex;   
425    hposition = mul( worldViewProj, position );
426}
427
428
429float4 DiffusePS( float2 Tex : TEXCOORD0,
430           float3 N : TEXCOORD1,
431           float3 pos : TEXCOORD2,
432           uniform float3 cameraPos,
433           uniform float3 lastCenter,   //LI//
434           uniform samplerCUBE SmallEnvMapSampler : register(s0),
435           uniform samplerCUBE DistanceEnvMapSampler : register(s1)
436            ) : COLOR0
437{
438    REDUCED_CUBEMAP_SIZE = 4;
439       
440    //V = /*-*/normalize( V );
441    float3 V = normalize(pos - cameraPos);      //
442    N = normalize( N );
443        float3 R = reflect(V, N);
444    pos -= lastCenter;
445
446       
447    //return float4(N,1);
448    //return float4(V,1);
449    //return float4(R,1);
450               
451        //return readCubeMap(SmallEnvMapSampler,R);
452       
453    //pos.xy += float2(1.0/LIGHT_TEXTURE_SIZE, -1.0/LIGHT_TEXTURE_SIZE);        // eltolás a pixel/texel középpontba
454    // x, y = -1..1
455    // z = 1
456   
457    float4 intens = 0;
458    /*
459        intens += GetContibution( R, pos, N, V, SmallEnvMapSampler);
460        intens = readCubeMap(SmallEnvMapSampler, R);
461        return intens;*/
462       
463        for (int x = 0; x < REDUCED_CUBEMAP_SIZE; x++)                  // az envmap minden texelére
464         for (int y = 0; y < REDUCED_CUBEMAP_SIZE; y++)
465        //int x = 0;            // az envmap 1 texelére
466        //int y = 0;
467        //if (x==LIGHT_TEXTURE_SIZE/2 && y==LIGHT_TEXTURE_SIZE/2)
468         {
469                // intenzitás kiolvasása az adott texelbõl
470               
471                float2 p, tpos;
472            tpos.x = x/(float)REDUCED_CUBEMAP_SIZE;     // 0..1
473            tpos.y = y/(float)REDUCED_CUBEMAP_SIZE;     // 0..1
474            tpos.xy += float2(0.5/REDUCED_CUBEMAP_SIZE, 0.5/REDUCED_CUBEMAP_SIZE);      // az adott texel középpont uv koordinátái
475           
476            p.x = tpos.x;
477            p.y = 1-tpos.y;
478            p.xy = 2*p.xy - 1;  // -1..1        // az adott texel középpont pozíciója
479           
480            float3 L;
481           
482                L = float3(p.x, p.y, 1);
483                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
484               
485                L = float3(p.x, p.y, -1);
486                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
487               
488                L = float3(p.x, 1, p.y);
489                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
490               
491                L = float3(p.x, -1, p.y);
492                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
493               
494                L = float3(1, p.x, p.y);
495                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
496               
497                L = float3(-1, p.x, p.y);
498                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
499        }
500
501        return intens;
502}
Note: See TracBrowser for help on using the repository browser.