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

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