source: GTP/branches/IllumWPdeliver2008dec/IlluminationWP/demos/OgreGames/CarGame/Media/materials/programs/GameTools_Localized_EnvMap.hlsl @ 3255

Revision 3255, 11.2 KB checked in by szirmay, 15 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        return color;
27}
28
29float readDistanceCubeMap(samplerCUBE dcm, float3 coord)               
30{
31        float dist = texCUBE(dcm, float3(coord.xy, - coord.z)).r;
32        if(dist == 0) dist = 40; ///sky
33        return dist;
34}
35
36/*
37float3 Hit( float3 x, float3 R, samplerCUBE mp )
38{
39 
40        float rl = readDistanceCubeMap(mp, R); // |r|
41       
42        float dp = rl - dot(x, R);              // parallax
43       
44        float3 p = x + R * dp;
45        return p;
46}*/
47
48
49
50
51// This function is called several times.
52float3 Hit( float3 x, float3 R, samplerCUBE mp )
53{
54        float rl = readDistanceCubeMap( mp, R);                         // |r|
55       
56        float ppp = length( x ) /  readDistanceCubeMap( mp, x);                 // |p|/|p’|
57        float dun = 0, pun = ppp, dov = 0, pov = 0;
58        float dl = rl * ( 1 - ppp );                                                    // eq. 2
59        float3 l = x + R * dl;                                                                  // ray equation
60
61        // iteration
62        for( int i = 0; i < 2; i++ )    // 2 !!!!!!!!!!!!!!!!!!!!!!!
63        {
64                float llp = length( l ) / readDistanceCubeMap( mp, l);          // |l|/|l’|
65                if ( llp < 0.999f )                                                                     // undershooting
66                {
67                        dun = dl; pun = llp;                                                    // last undershooting
68                        dl += ( dov == 0 ) ? rl * ( 1 - llp ) :                 // eq. 2
69                                ( dl - dov ) * ( 1 - llp ) / ( llp - pov );     // eq. 3
70                } else if ( llp > 1.001f )                                                      // overshooting
71                {
72                        dov = dl; pov = llp;                                                    // last overshooting
73                        dl += ( dl -dun ) * ( 1 - llp ) / ( llp - pun );// eq. 3
74                }
75                l = x + R * dl;                                                                         // ray equation
76        }
77        return l;                                                                                               // computed hit point
78}
79
80void LocalizedVS(float4 position : POSITION,
81                out float3 wPos : TEXCOORD1,                           
82                float2 texCoord : TEXCOORD0,
83                out float2 otexCoord : TEXCOORD0,
84                float3 normal   : NORMAL,
85                out float3 mNormal  : TEXCOORD2,
86                out float4 hPos : POSITION,             
87                uniform float4x4 worldViewProj,
88                uniform float4x4 world,
89                uniform float4x4 worldIT)
90{
91 
92  hPos = mul(worldViewProj, position);
93  wPos = mul(world, position).xyz; 
94  mNormal = mul(normal, worldIT);
95 // mNormal = normal;
96  otexCoord = texCoord;
97}
98//////////////
99//Localized reflection
100//////////////
101void LocalizedPS(  float2 texCoord : TEXCOORD0,
102                float3 wPos     : TEXCOORD1,   
103                float3 mNormal  : TEXCOORD2,
104                uniform float3 cameraPos,
105                uniform samplerCUBE CubeMap : register(s0),
106                uniform samplerCUBE DistanceMap : register(s1),
107                uniform float3 lastCenter,
108                uniform float3 lightPosition,           
109                out float4 Color :COLOR0)
110{
111       
112        Color = float4(1,1,1,1);
113       
114        mNormal = normalize(mNormal);
115        float3 RR, TT; 
116        float3 mPos = wPos - lastCenter;
117        float3 V = normalize(wPos - cameraPos);
118        float3 R = normalize(reflect( V, mNormal));
119       
120        float3 T =  normalize(refract(V, mNormal, 0.9));
121               
122        RR = R; TT = T;
123       
124        //RR += 0.000001 * lastCenter.x;
125       
126        RR = Hit(mPos, R, DistanceMap);
127        TT = Hit(mPos, T, DistanceMap);
128       
129        float4 reflectcolor = readCubeMap(CubeMap, RR );               
130        float4 refractcolor = readCubeMap(CubeMap, TT );               
131       
132        float cos_theta = -dot(V, mNormal);
133        float sFresnel = 0.2;
134        float F = (sFresnel + pow(1-cos_theta, 5.0f) * (1-sFresnel));
135 
136
137        Color = (F * reflectcolor + (1-F) * refractcolor) ;     
138}
139
140
141
142//////////////
143//Metal
144//////////////
145void LocalizedMetalPS(  float2 texCoord : TEXCOORD0,
146                float3 wPos     : TEXCOORD1,   
147                float3 mNormal  : TEXCOORD2,
148                uniform float3 cameraPos,
149                uniform samplerCUBE CubeMap : register(s0),
150                uniform samplerCUBE DistanceMap : register(s1),
151                uniform float3 lastCenter,
152                uniform float3 lightPosition,                           
153                out float4 Color :COLOR0)
154{
155       
156        Color = float4(1,1,1,1);
157       
158        mNormal = normalize(mNormal);
159        float3 newTexCoord;     
160        float3 mPos = wPos - lastCenter;
161        float3 V = normalize(wPos - cameraPos);
162        float3 R = normalize(reflect( V, mNormal));
163               
164        newTexCoord = R;       
165       
166        newTexCoord = Hit(mPos, R, DistanceMap);
167        Color = readCubeMap(CubeMap, newTexCoord );
168       
169        //Color = float4(mNormal + lastCenter.x*0.0000001, 1); 
170       
171        float ctheta_in = dot(mNormal,R);
172        float ctheta_out = dot(mNormal,-V);
173
174        float3 F = 0;
175       
176        // F,P,G számítása
177        if ( ctheta_in > 0 && ctheta_out > 0 )
178        {
179                float3 H = normalize(R - V);    // felezõvektor
180                float cbeta  = dot(H,R);               
181                //F = ( (n-1)*(n-1) + pow(1-cbeta,5) * 4*n + k*k) / ( (n+1)*(n+1) + k*k );
182                //float3 F0 = ((n-1)*(n-1) + k*k) / ( (n+1)*(n+1) + k*k );
183                //float3 F1 = float3(1.0f,1.0f,1.0f) - F0;
184                F = F0 + (1-F0)*pow(1-cbeta,5);
185        }       
186       
187        Color = Color * float4(F,1);
188       
189        //Color = length(lastCenter.xyz) * 0.1;
190}
191//////////////
192//PhotonMap
193//////////////
194/*void PhotonMapPS(  float2 texCoord : TEXCOORD0,
195                float3 wPos     : TEXCOORD1,   
196                float3 mNormal  : TEXCOORD2,
197                uniform float3 cameraPos,
198                uniform samplerCUBE UVMap : register(s0),
199                uniform samplerCUBE DistanceMap : register(s1),
200                uniform float3 lastCenter,
201                out float4 Color :COLOR0)
202{
203       
204        Color = float4(1,1,1,1);
205       
206        mNormal = normalize(mNormal);
207        float3 newTexCoord;     
208        float3 mPos = wPos - lastCenter;
209        float3 V = normalize(wPos - cameraPos);
210        float3 R = normalize(reflect( V, mNormal));
211               
212        newTexCoord = R;       
213       
214        newTexCoord = Hit(mPos, R, DistanceMap);
215       
216        Color = readCubeMap(UVMap, newTexCoord );
217        //Color = float4(1,0,0,1);             
218}*/
219
220float4 PhotonMapCausticPS(  float2 texCoord : TEXCOORD0,
221                float3 wPos     : TEXCOORD1,   
222                float3 mNormal  : TEXCOORD2,
223                uniform float3 cameraPos,
224                uniform samplerCUBE DistanceMap : register(s0),
225                uniform float3 lastCenter):COLOR0
226{
227       
228        float4 Color = float4(1,1,1,1);
229       
230        mNormal = normalize(mNormal);
231        float3 newTexCoord;     
232        float3 mPos = wPos - lastCenter;
233        float3 V = normalize(wPos - cameraPos);
234        float3 R = normalize(reflect( V, mNormal ));
235               
236        newTexCoord = R;       
237       
238        newTexCoord = Hit(mPos, R, DistanceMap);
239               
240        Color = float4(normalize(newTexCoord),1);
241       
242        //Color = 0.0001 * Color +  float4(0,0,1,1);
243        //Color += 0.0001 * lastCenter.x;
244        //if(dot(V,mNormal)>0)
245        //{
246        //      Color = float4(1,0,0,0);               
247        //}             
248        return Color;
249}
250
251void PhotonMapSoftShadowPS(  float2 texCoord : TEXCOORD0,
252                float3 wPos     : TEXCOORD1,   
253                float3 mNormal  : TEXCOORD2,
254                uniform float3 cameraPos,
255                uniform samplerCUBE DistanceMap : register(s0),
256                uniform float3 lastCenter,
257                out float4 Color :COLOR0)
258{
259       
260        Color = float4(1,1,1,1);
261       
262        mNormal = normalize(mNormal);
263        float3 newTexCoord;     
264        float3 mPos = wPos - lastCenter;
265        float3 V = normalize(wPos - cameraPos);
266        newTexCoord = V;       
267       
268        newTexCoord = Hit(mPos, V, DistanceMap);
269       
270        Color = float4(normalize(newTexCoord),1);
271}
272
273/////////////////////
274///// Diffuse
275///////////////////
276
277float4 GetContibution(float3 L, float3 pos, float3 N, float3 V, samplerCUBE SmallEnvMapSampler, samplerCUBE DistanceEnvMapSampler)      // Phong-Blinn
278// L: a hossza lényeges (az egységkocka faláig ér)
279{
280    REDUCED_CUBEMAP_SIZE = 4;
281   
282        float kd = 0.3; // 0.3
283        float ks = 0;   // 0.5
284        float shininess = 10;
285       
286        float l = length(L);
287        L = normalize(L);
288
289        //dw
290        float dw = 4 / (REDUCED_CUBEMAP_SIZE*REDUCED_CUBEMAP_SIZE*l*l*l + 4/3.1416f);
291        //Lin
292        float4 Lin = readCubeMap(SmallEnvMapSampler, L);
293        //r
294        float doy = readDistanceCubeMap(DistanceEnvMapSampler, L);
295        float dxy = length(L * doy - pos);     
296
297        //dws
298        float dws = (doy*doy * dw) / (dxy*dxy*(1 - dw/3.1416f) + doy*doy*dw/3.1416f);   // localization:
299        //float dws = dw;
300       
301        //L = L * doy - pos;    // L: x->y, az objektumtól induljon, ne a középpontból
302        L = normalize(L);
303        float3 H = normalize(L + V);    // felezõvektor
304
305        float a = kd * max(dot(N,L),0) +
306                          ks * pow(max(dot(N,H),0), shininess); // diffuse + specular
307
308        // 1.: eddigi
309        //return Lin * a * dws;
310       
311        float ctheta_in = dot(N,L);
312        float ctheta_out = dot(N,V);   
313       
314        return Lin * a * dws;           
315}
316
317void DiffuseVS( float4 position : POSITION,
318                float3 normal : NORMAL,
319                float2 Tex : TEXCOORD0,
320                uniform float4x4 worldViewProj,
321                                uniform float4x4 world,
322                                //uniform float3 lastCenter,    //LI//
323                                out float4 hposition : POSITION,
324                out float2 oTex : TEXCOORD0,
325                out float3 Normal : TEXCOORD1,
326                out float3 pos : TEXCOORD2 )
327{
328        pos = /*lastCenter + 0.01 * */mul( world, position ).xyz;
329        Normal = normal;
330    oTex = Tex;   
331    hposition = mul( worldViewProj, position );
332}
333
334
335float4 DiffusePS( float2 Tex : TEXCOORD0,
336           float3 pos : TEXCOORD1,
337           float3 N : TEXCOORD2,
338           uniform float3 cameraPos,
339           uniform float3 lastCenter,   //LI//
340           uniform half3 lightPosition,
341           uniform samplerCUBE SmallEnvMapSampler : register(s0),
342           uniform samplerCUBE DistanceEnvMapSampler : register(s1),
343                        uniform sampler2D ColorTexture : register(s2)
344            ) : COLOR0
345{
346    REDUCED_CUBEMAP_SIZE = 8;
347       
348    //V = /*-*/normalize( V );
349    float3 V = normalize(pos - cameraPos);      //
350    N = normalize( N );
351        float3 R = reflect(V, N);
352    pos -= lastCenter;
353
354       
355    //return float4(N,1);
356    //return float4(V,1);
357    //return float4(R,1);
358               
359        //return readCubeMap(SmallEnvMapSampler,R);
360       
361    //pos.xy += float2(1.0/LIGHT_TEXTURE_SIZE, -1.0/LIGHT_TEXTURE_SIZE);        // eltolás a pixel/texel középpontba
362    // x, y = -1..1
363    // z = 1
364   
365    float4 intens = 0;
366    /*
367        intens += GetContibution( R, pos, N, V, SmallEnvMapSampler);
368        intens = readCubeMap(SmallEnvMapSampler, R);
369        return intens;*/
370       
371        for (int x = 0; x < REDUCED_CUBEMAP_SIZE; x++)                  // az envmap minden texelére
372         for (int y = 0; y < REDUCED_CUBEMAP_SIZE; y++)
373        //int x = 0;            // az envmap 1 texelére
374        //int y = 0;
375        //if (x==LIGHT_TEXTURE_SIZE/2 && y==LIGHT_TEXTURE_SIZE/2)
376         {
377                // intenzitás kiolvasása az adott texelbõl
378               
379                float2 p, tpos;
380            tpos.x = x/(float)REDUCED_CUBEMAP_SIZE;     // 0..1
381            tpos.y = y/(float)REDUCED_CUBEMAP_SIZE;     // 0..1
382            tpos.xy += float2(0.5/REDUCED_CUBEMAP_SIZE, 0.5/REDUCED_CUBEMAP_SIZE);      // az adott texel középpont uv koordinátái
383           
384            p.x = tpos.x;
385            p.y = 1-tpos.y;
386            p.xy = 2*p.xy - 1;  // -1..1        // az adott texel középpont pozíciója
387           
388            float3 L;
389           
390                L = float3(p.x, p.y, 1);
391                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
392               
393                L = float3(p.x, p.y, -1);
394                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
395               
396                L = float3(p.x, 1, p.y);
397                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
398               
399                L = float3(p.x, -1, p.y);
400                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
401               
402                L = float3(1, p.x, p.y);
403                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
404               
405                L = float3(-1, p.x, p.y);
406                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
407        }
408
409        float4 retColor = intens;
410        retColor *= tex2D(ColorTexture, Tex);
411        return retColor;
412}
Note: See TracBrowser for help on using the repository browser.