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

Revision 1060, 10.5 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        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 = 100000; ///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{
90 
91  hPos = mul(worldViewProj, position);
92  wPos = mul(world, position).xyz; 
93  mNormal = normal;
94  otexCoord = texCoord;
95}
96//////////////
97//Localized reflection
98//////////////
99void LocalizedPS(  float2 texCoord : TEXCOORD0,
100                float3 wPos     : TEXCOORD1,   
101                float3 mNormal  : TEXCOORD2,
102                uniform float3 cameraPos,
103                uniform samplerCUBE CubeMap : register(s0),
104                uniform samplerCUBE DistanceMap : register(s1),
105                uniform float3 lastCenter,
106                uniform float3 lightPosition,           
107                out float4 Color :COLOR0)
108{
109       
110        Color = float4(1,1,1,1);
111       
112        mNormal = normalize(mNormal);
113        float3 RR, TT; 
114        float3 mPos = wPos - lastCenter;
115        float3 V = normalize(wPos - cameraPos);
116        float3 R = /*normalize*/(reflect( V, mNormal));
117       
118        float3 T = refract(V, mNormal, 0.9);
119               
120        RR = R; TT = T;
121        //RR += 0.000001 * lastCenter.x;
122        RR = Hit(mPos, R, DistanceMap);
123        TT = Hit(mPos, T, DistanceMap);
124       
125        float4 reflectcolor = readCubeMap(CubeMap, RR );               
126        float4 refractcolor = readCubeMap(CubeMap, TT );               
127       
128        float cos_theta = -dot(V, mNormal);
129        float sFresnel = 0.5;
130        float F = (sFresnel + pow(1-cos_theta, 5.0f) * (1-sFresnel));
131   
132    float3 L = normalize(lightPosition - wPos);
133        float3 H = normalize(L+V);
134        float4 lighting = lit(dot(mNormal, L),dot(mNormal, H), 30);
135        Color = (F * reflectcolor + (1-F) * refractcolor) + lighting.z;
136}
137
138
139
140//////////////
141//Metal
142//////////////
143void LocalizedMetalPS(  float2 texCoord : TEXCOORD0,
144                float3 wPos     : TEXCOORD1,   
145                float3 mNormal  : TEXCOORD2,
146                uniform float3 cameraPos,
147                uniform samplerCUBE CubeMap : register(s0),
148                uniform samplerCUBE DistanceMap : register(s1),
149                uniform float3 lastCenter,
150                uniform float3 lightPosition,                           
151                out float4 Color :COLOR0)
152{
153       
154        Color = float4(1,1,1,1);
155       
156        mNormal = normalize(mNormal);
157        float3 newTexCoord;     
158        float3 mPos = wPos - lastCenter;
159        float3 V = normalize(wPos - cameraPos);
160        float3 R = normalize(reflect( V, mNormal));
161               
162        newTexCoord = R;       
163       
164        //newTexCoord = Hit(mPos, R, DistanceMap);
165       
166        Color = readCubeMap(CubeMap, newTexCoord ) + lastCenter.x*0.000001;     
167       
168        float ctheta_in = dot(mNormal,R);
169        float ctheta_out = dot(mNormal,-V);
170
171        float3 F = 0;
172       
173        // F,P,G számítása
174        if ( ctheta_in > 0 && ctheta_out > 0 )
175        {
176                float3 H = normalize(R - V);    // felezõvektor
177                float cbeta  = dot(H,R);               
178                //F = ( (n-1)*(n-1) + pow(1-cbeta,5) * 4*n + k*k) / ( (n+1)*(n+1) + k*k );
179                //float3 F0 = ((n-1)*(n-1) + k*k) / ( (n+1)*(n+1) + k*k );
180                //float3 F1 = float3(1.0f,1.0f,1.0f) - F0;
181                F = F0 + (1-F0)*pow(1-cbeta,5);
182        }       
183       
184        Color = Color * float4(F,1);   
185}
186//////////////
187//PhotonMap
188//////////////
189/*void PhotonMapPS(  float2 texCoord : TEXCOORD0,
190                float3 wPos     : TEXCOORD1,   
191                float3 mNormal  : TEXCOORD2,
192                uniform float3 cameraPos,
193                uniform samplerCUBE UVMap : register(s0),
194                uniform samplerCUBE DistanceMap : register(s1),
195                uniform float3 lastCenter,
196                out float4 Color :COLOR0)
197{
198       
199        Color = float4(1,1,1,1);
200       
201        mNormal = normalize(mNormal);
202        float3 newTexCoord;     
203        float3 mPos = wPos - lastCenter;
204        float3 V = normalize(wPos - cameraPos);
205        float3 R = normalize(reflect( V, mNormal));
206               
207        newTexCoord = R;       
208       
209        newTexCoord = Hit(mPos, R, DistanceMap);
210       
211        Color = readCubeMap(UVMap, newTexCoord );
212        //Color = float4(1,0,0,1);             
213}*/
214
215float4 PhotonMapCausticPS(  float2 texCoord : TEXCOORD0,
216                float3 wPos     : TEXCOORD1,   
217                float3 mNormal  : TEXCOORD2,
218                uniform float3 cameraPos,
219                uniform samplerCUBE DistanceMap : register(s0),
220                uniform float3 lastCenter):COLOR0
221{
222       
223        float4 Color = float4(1,1,1,1);
224       
225        mNormal = normalize(mNormal);
226        float3 newTexCoord;     
227        float3 mPos = wPos - lastCenter;
228        float3 V = normalize(wPos - cameraPos);
229               
230        float3 R = refract(V, mNormal, 0.9);           
231        //float3 R = V;
232        newTexCoord = R;       
233               
234        newTexCoord = Hit(mPos, R, DistanceMap);
235               
236        Color = float4(normalize(newTexCoord),1);
237       
238        //Color = 0.0001 * Color +  float4(0,0,1,1);
239        //Color += 0.0001 * lastCenter.x;
240        if(dot(V,mNormal)>0)
241        {
242                Color = float4(1,0,0,0);               
243        }               
244        return Color;
245}
246
247
248
249/////////////////////
250///// Diffuse
251///////////////////
252
253float4 GetContibution(float3 L, float3 pos, float3 N, float3 V, samplerCUBE SmallEnvMapSampler, samplerCUBE DistanceEnvMapSampler)      // Phong-Blinn
254// L: a hossza lényeges (az egységkocka faláig ér)
255{
256    REDUCED_CUBEMAP_SIZE = 4;
257   
258        float kd = 0.3; // 0.3
259        float ks = 0;   // 0.5
260        float shininess = 10;
261       
262        float l = length(L);
263        L = normalize(L);
264
265        //dw
266        float dw = 4 / (REDUCED_CUBEMAP_SIZE*REDUCED_CUBEMAP_SIZE*l*l*l + 4/3.1416f);
267        //Lin
268        float4 Lin = readCubeMap(SmallEnvMapSampler, L);
269        //r
270        float doy = readDistanceCubeMap(DistanceEnvMapSampler, L);
271        float dxy = length(L * doy - pos);     
272
273        //dws
274        float dws = (doy*doy * dw) / (dxy*dxy*(1 - dw/3.1416f) + doy*doy*dw/3.1416f);   // localization:
275        //float dws = dw;
276       
277        //L = L * doy - pos;    // L: x->y, az objektumtól induljon, ne a középpontból
278        L = normalize(L);
279        float3 H = normalize(L + V);    // felezõvektor
280
281        float a = kd * max(dot(N,L),0) +
282                          ks * pow(max(dot(N,H),0), shininess); // diffuse + specular
283
284        // 1.: eddigi
285        //return Lin * a * dws;
286       
287        float ctheta_in = dot(N,L);
288        float ctheta_out = dot(N,V);   
289       
290        return Lin * a * dws;           
291}
292
293void DiffuseVS( float4 position : POSITION,
294                float3 normal : NORMAL,
295                float2 Tex : TEXCOORD0,
296                uniform float4x4 worldViewProj,
297                                uniform float4x4 world,
298                                //uniform float3 lastCenter,    //LI//
299                                out float4 hposition : POSITION,
300                out float2 oTex : TEXCOORD0,
301                out float3 Normal : TEXCOORD1,
302                out float3 pos : TEXCOORD2 )
303{
304        pos = /*lastCenter + 0.01 * */mul( world, position ).xyz;
305        Normal = normal;
306    oTex = Tex;   
307    hposition = mul( worldViewProj, position );
308}
309
310
311float4 DiffusePS( float2 Tex : TEXCOORD0,
312           float3 N : TEXCOORD1,
313           float3 pos : TEXCOORD2,
314           uniform float3 cameraPos,
315           uniform float3 lastCenter,   //LI//
316           uniform samplerCUBE SmallEnvMapSampler : register(s0),
317           uniform samplerCUBE DistanceEnvMapSampler : register(s1)
318            ) : COLOR0
319{
320    REDUCED_CUBEMAP_SIZE = 4;
321       
322    //V = /*-*/normalize( V );
323    float3 V = normalize(pos - cameraPos);      //
324    N = normalize( N );
325        float3 R = reflect(V, N);
326    pos -= lastCenter;
327
328       
329    //return float4(N,1);
330    //return float4(V,1);
331    //return float4(R,1);
332               
333        //return readCubeMap(SmallEnvMapSampler,R);
334       
335    //pos.xy += float2(1.0/LIGHT_TEXTURE_SIZE, -1.0/LIGHT_TEXTURE_SIZE);        // eltolás a pixel/texel középpontba
336    // x, y = -1..1
337    // z = 1
338   
339    float4 intens = 0;
340    /*
341        intens += GetContibution( R, pos, N, V, SmallEnvMapSampler);
342        intens = readCubeMap(SmallEnvMapSampler, R);
343        return intens;*/
344       
345        for (int x = 0; x < REDUCED_CUBEMAP_SIZE; x++)                  // az envmap minden texelére
346         for (int y = 0; y < REDUCED_CUBEMAP_SIZE; y++)
347        //int x = 0;            // az envmap 1 texelére
348        //int y = 0;
349        //if (x==LIGHT_TEXTURE_SIZE/2 && y==LIGHT_TEXTURE_SIZE/2)
350         {
351                // intenzitás kiolvasása az adott texelbõl
352               
353                float2 p, tpos;
354            tpos.x = x/(float)REDUCED_CUBEMAP_SIZE;     // 0..1
355            tpos.y = y/(float)REDUCED_CUBEMAP_SIZE;     // 0..1
356            tpos.xy += float2(0.5/REDUCED_CUBEMAP_SIZE, 0.5/REDUCED_CUBEMAP_SIZE);      // az adott texel középpont uv koordinátái
357           
358            p.x = tpos.x;
359            p.y = 1-tpos.y;
360            p.xy = 2*p.xy - 1;  // -1..1        // az adott texel középpont pozíciója
361           
362            float3 L;
363           
364                L = float3(p.x, p.y, 1);
365                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
366               
367                L = float3(p.x, p.y, -1);
368                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
369               
370                L = float3(p.x, 1, p.y);
371                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
372               
373                L = float3(p.x, -1, p.y);
374                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
375               
376                L = float3(1, p.x, p.y);
377                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
378               
379                L = float3(-1, p.x, p.y);
380                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
381        }
382
383        return intens+0.0001*lastCenter.x;
384}
Note: See TracBrowser for help on using the repository browser.