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

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