source: GTP/trunk/App/Games/CarDriving_BME/Media/materials/programs/DiffuseBump.hlsl @ 2451

Revision 2451, 6.0 KB checked in by szirmay, 17 years ago (diff)
Line 
1//#define EFFECTS
2
3float4x4 world_I;
4int REDUCED_CUBEMAP_SIZE = 8;
5
6
7float4 readCubeMap(samplerCUBE cm, float3 coord)               
8{
9        float4 color = texCUBE( cm, float3(coord.xy, - coord.z) );
10        return color;
11}
12
13float readDistanceCubeMap(samplerCUBE dcm, float3 coord)               
14{
15        float dist = texCUBE(dcm, float3(coord.xy, - coord.z)).r;
16        if(dist == 0) dist = 4000; ///sky
17        return dist;
18}
19
20// This function is called several times.
21float3 Hit( float3 x, float3 R, samplerCUBE mp )
22{
23        float rl = readDistanceCubeMap( mp, R);                         // |r|
24       
25        float ppp = length( x ) /  readDistanceCubeMap( mp, x);                 // |p|/|p’|
26        float dun = 0, pun = ppp, dov = 0, pov = 0;
27        float dl = rl * ( 1 - ppp );                                                    // eq. 2
28        float3 l = x + R * dl;                                                                  // ray equation
29
30        // iteration
31        for( int i = 0; i < 2; i++ )    // 2 !!!!!!!!!!!!!!!!!!!!!!!
32        {
33                float llp = length( l ) / readDistanceCubeMap( mp, l);          // |l|/|l’|
34                if ( llp < 0.999f )                                                                     // undershooting
35                {
36                        dun = dl; pun = llp;                                                    // last undershooting
37                        dl += ( dov == 0 ) ? rl * ( 1 - llp ) :                 // eq. 2
38                                ( dl - dov ) * ( 1 - llp ) / ( llp - pov );     // eq. 3
39                } else if ( llp > 1.001f )                                                      // overshooting
40                {
41                        dov = dl; pov = llp;                                                    // last overshooting
42                        dl += ( dl -dun ) * ( 1 - llp ) / ( llp - pun );// eq. 3
43                }
44                l = x + R * dl;                                                                         // ray equation
45        }
46        return l;                                                                                               // computed hit point
47}
48
49float4 GetContibution(float3 L, float3 pos, float3 N, float3 V, samplerCUBE SmallEnvMapSampler, samplerCUBE DistanceEnvMapSampler)      // Phong-Blinn
50// L: a hossza lényeges (az egységkocka faláig ér)
51{
52    REDUCED_CUBEMAP_SIZE = 4;
53    float mindist = 1.0;
54   
55        float kd = 0.3; // 0.3
56        float ks = 0;   // 0.5
57        float shininess = 10;
58       
59        float l = length(L);
60        L = normalize(L);
61
62        //dw
63        float dw = 4 / (REDUCED_CUBEMAP_SIZE*REDUCED_CUBEMAP_SIZE*l*l*l + 4/3.1416f);
64        //Lin
65        float4 Lin = readCubeMap(SmallEnvMapSampler, L);
66        //r
67        float doy = readDistanceCubeMap(DistanceEnvMapSampler, L);
68        float dxy = length(L * doy - pos);
69       
70        dxy = max(mindist, dxy);
71               
72
73        //dws
74        float dws = (doy*doy * dw) / (dxy*dxy*(1 - dw/3.1416f) + doy*doy*dw/3.1416f);   // localization:
75        //float dws = dw;
76       
77        //L = L * doy - pos;    // L: x->y, az objektumtól induljon, ne a középpontból
78        L = normalize(L);
79        float3 H = normalize(L + V);    // felezõvektor
80
81        float a = kd * max(dot(N,L),0) +
82                          ks * pow(max(dot(N,H),0), shininess); // diffuse + specular
83
84        // 1.: eddigi
85        //return Lin * a * dws;
86       
87        float ctheta_in = dot(N,L);
88        float ctheta_out = dot(N,V);   
89       
90        return Lin * a * dws;           
91}
92
93void DiffuseVS(float4 position : POSITION,
94                float3 normal   : NORMAL,
95                half3 tangent   : TEXCOORD1,
96                float2 texCoord : TEXCOORD0,
97                out float2 otexCoord : TEXCOORD0,
98                out float3 wPos : TEXCOORD1,                           
99                out float3 mNormal  : TEXCOORD2,
100                out half3 Tangent   : TEXCOORD3,         
101                out half3 Binormal  : TEXCOORD4,         
102                out float4 hPos : POSITION,             
103                uniform float4x4 worldViewProj,
104                uniform float4x4 world)
105{
106 
107  hPos = mul(worldViewProj, position);
108  wPos = mul(world, position).xyz; 
109  mNormal = normalize(mul(normal, world_I));
110  otexCoord = texCoord;
111  Tangent = normalize(mul(tangent, world_I)); 
112  Binormal = cross(tangent, normal);
113}
114
115float4 DiffusePS( float2 Tex : TEXCOORD0,
116           float3 pos : TEXCOORD1,
117           float3 N : TEXCOORD2,
118           half3 Tangent   : TEXCOORD3, 
119                   half3 Binormal  : TEXCOORD4,
120           uniform float3 cameraPos,
121           uniform float3 lastCenter,
122           uniform half4 lightPosition,                         
123           uniform samplerCUBE SmallEnvMapSampler : register(s0),
124           uniform samplerCUBE DistanceEnvMapSampler : register(s1),
125                   uniform sampler2D ColorTexture : register(s2),
126                   uniform sampler2D NormalMap : register(s3)                           
127            ) : COLOR0
128{
129    REDUCED_CUBEMAP_SIZE = 4;
130       
131    Tangent = normalize(Tangent);
132    N = normalize(N);
133    Binormal = normalize(Binormal);
134    //V = /*-*/normalize( V );
135    float3 V = normalize(pos - cameraPos);      //
136   
137    float3x3 ModelToTangent = float3x3(Tangent, Binormal, N);
138        half3 tNormal = tex2D(NormalMap, Tex).rgb;     
139     
140    N = normalize(mul(tNormal, ModelToTangent ));
141   
142    float3 R = reflect(V, N);
143    pos -= lastCenter; 
144       
145    float4 intens = 0;
146   
147#ifdef EFFECTS 
148        for (int x = 0; x < REDUCED_CUBEMAP_SIZE; x++)                  // az envmap minden texelére
149         for (int y = 0; y < REDUCED_CUBEMAP_SIZE; y++)
150         {
151                // intenzitás kiolvasása az adott texelbõl
152               
153                float2 p, tpos;
154            tpos.x = x/(float)REDUCED_CUBEMAP_SIZE;     // 0..1
155            tpos.y = y/(float)REDUCED_CUBEMAP_SIZE;     // 0..1
156            tpos.xy += float2(0.5/REDUCED_CUBEMAP_SIZE, 0.5/REDUCED_CUBEMAP_SIZE);      // az adott texel középpont uv koordinátái
157           
158            p.x = tpos.x;
159            p.y = 1-tpos.y;
160            p.xy = 2*p.xy - 1;  // -1..1        // az adott texel középpont pozíciója
161           
162            float3 L;
163           
164                L = float3(p.x, p.y, 1);
165                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
166               
167                L = float3(p.x, p.y, -1);
168                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
169               
170                L = float3(p.x, 1, p.y);
171                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
172               
173                L = float3(p.x, -1, p.y);
174                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
175               
176                L = float3(1, p.x, p.y);
177                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
178               
179                L = float3(-1, p.x, p.y);
180                intens += GetContibution( L, pos, N, V, SmallEnvMapSampler, DistanceEnvMapSampler);
181        }
182
183#endif 
184        half3 light = lightPosition.xyz;
185        half3 L = normalize(light);
186        half3 H = normalize(L - V);
187        half4 lighting = lit(dot(N, L),dot(N, H), 20);
188
189        float4 retColor = intens;
190        float4 texColor = tex2D(ColorTexture, Tex);
191#ifdef EFFECTS 
192       
193                retColor = intens * texColor * 1.5
194                          + lighting.y * texColor * 0.15
195                          + lighting.z * 0.15                   
196                         ;
197#else
198retColor =lighting.y * texColor
199                          + lighting.z;
200#endif
201        return retColor;
202}
Note: See TracBrowser for help on using the repository browser.