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

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