source: GTP/branches/IllumWPdeliver2008dec/IlluminationWP/precompiled/app/OgreIllumModule_Resources/materials/GTPAdvancedEnvMap/diffuseSimple/GTPDiffuseSimple.hlsl @ 3255

Revision 3255, 5.0 KB checked in by szirmay, 15 years ago (diff)
Line 
1
2#define CUBEMAP_SIZE 64
3#define REDUCED_CUBEMAP_SIZE 2
4#define RATE 32
5
6float4 readCubeMap(samplerCUBE cm, float3 coord)               
7{
8        float4 color = texCUBElod( cm, float4(coord.xy, -coord.z, 0) );
9        color.a = 1;
10        return color;
11}
12
13float readDistanceCubeMap(samplerCUBE dcm, float3 coord)               
14{
15        float dist = texCUBElod(dcm, float4(coord.xy, - coord.z, 0)).r;
16        if(dist == 0) dist = 1000000; ///sky
17        return dist;
18}
19
20////////////////////////////
21/// Reduce cube map shader
22///////////////////////////
23struct MPos_OUT
24{
25 float4 VPos : POSITION;
26 float4 MPos : TEXCOORD0;
27};
28
29float4 ReduceCubeMap_PS(MPos_OUT IN,
30                                                uniform int nFace,
31                                                uniform samplerCUBE EnvironmentMapSampler : register(s0) ) : COLOR
32
33   float4 color = 0;
34   float3 dir;
35 
36   for (int i = 0; i < RATE/2; i+=1)
37     for (int j = 0; j < RATE/2; j+=1)
38    {
39                float2 pos;
40                pos.x = IN.MPos.x + (4*i + 2)/(float)CUBEMAP_SIZE;
41                pos.y = IN.MPos.y - (4*j + 2)/(float)CUBEMAP_SIZE;      // y=-u
42
43                // "scrambling"
44                if (nFace == 0) dir = float3(1, pos.y, -pos.x);
45                if (nFace == 1) dir = float3(-1, pos.y, pos.x);
46                if (nFace == 2) dir = float3(pos.x, 1, -pos.y);
47                if (nFace == 3) dir = float3(pos.x, -1, pos.y);
48                if (nFace == 4) dir = float3(pos.x, pos.y, 1);
49                if (nFace == 5) dir = float3(-pos.x, pos.y,-1);
50
51                color += texCUBE( EnvironmentMapSampler, dir);
52    }
53 
54        return color / (RATE * RATE / 4.0);             
55}
56
57////////////////
58/// Diffuse
59///////////////
60
61/// Polygon to point form factor
62
63float4 Poly2Point_Contr(float3 L, float3 L1, float3 L2, float3 L3, float3 L4, float3 pos, float3 N, samplerCUBE cubemap)
64{
65        float d;
66        //d = texCUBE(cubemap, L).a;   
67        d = readDistanceCubeMap(cubemap, L1);   
68        L1 = d * normalize(L1);
69        d = readDistanceCubeMap(cubemap, L2);   
70        L2 = d * normalize(L2);
71        d = readDistanceCubeMap(cubemap, L3);   
72        L3 = d * normalize(L3);
73        d = readDistanceCubeMap(cubemap, L4);   
74        L4 = d * normalize(L4);
75               
76       
77    float3 r1 = normalize(L1 - pos);   
78    float3 r2 = normalize(L2 - pos);
79    float3 r3 = normalize(L3 - pos);
80    float3 r4 = normalize(L4 - pos);
81  /*           
82        float tri1 = acos(dot(r1, r2)) * dot(cross(r1, r2), N);
83        float tri2 = acos(dot(r2, r3)) * dot(cross(r2, r3), N);
84        float tri3 = acos(dot(r3, r4)) * dot(cross(r3, r4), N);
85        float tri4 = acos(dot(r4, r1)) * dot(cross(r4, r1), N);
86  */
87  float3 crossP = cross(r1, r2);
88  float r = length(crossP);
89  float dd = dot(r1,r2);
90  float tri1 = acos(dd) * dot(crossP/r, N);
91 
92  crossP = cross(r2, r3);
93  r = length(crossP);
94  dd = dot(r1,r2);
95  float tri2 = acos(dd) * dot(crossP/r, N);
96 
97  crossP = cross(r3, r4);
98  r = length(crossP);
99  dd = dot(r1,r2);
100  float tri3 = acos(dd) * dot(crossP/r, N);
101 
102  crossP = cross(r4, r1);
103  r = length(crossP);
104  dd = dot(r1,r2);
105  float tri4= acos(dd) * dot(crossP/r, N);
106 
107 
108        return max(tri1 + tri2 + tri3 + tri4, 0);       
109        //return tri1 + tri2 + tri3 + tri4;     
110}
111
112struct Shaded_OUT
113{
114 float4 vPos : POSITION;
115 float4 wNormal : TEXCOORD0;
116 float4 wPos    : TEXCOORD1;
117};
118
119float4 Diffuse_Poly2Point_PS( Shaded_OUT IN,
120                                                        uniform float3 lastCenter,
121                                                        uniform samplerCUBE SmallEnvMapSampler : register(s0),
122                                                        uniform samplerCUBE DistanceEnvMapSampler : register(s1)
123            ) : COLOR0
124{
125    float M = REDUCED_CUBEMAP_SIZE;
126       
127    float3 N = IN.wNormal.xyz;
128    N = normalize( N );
129    float3 pos = IN.wPos.xyz - lastCenter;
130   
131    float4 I = 0;                                                                       
132    float4 Le;                                                                         
133   
134    Le = float4(readCubeMap(SmallEnvMapSampler, float3(1,0,0)).rgb, 1);         
135    I += 0.5 * Le * Poly2Point_Contr( float3(1,0,0), float3(1,-0.5,0.5), float3(1,-0.5,-0.5), float3(1,0.5,-0.5), float3(1,0.5,0.5), pos, N, DistanceEnvMapSampler);           
136
137    Le = float4(readCubeMap(SmallEnvMapSampler, float3(-1,0,0)).rgb, 1);               
138    I += 0.5 * Le * Poly2Point_Contr( float3(-1,0,0), float3(-1,-0.5,-0.5), float3(-1,-0.5,0.5), float3(-1,0.5,0.5), float3(-1,0.5,-0.5), pos, N, DistanceEnvMapSampler);                                       
139   
140     Le = float4(readCubeMap(SmallEnvMapSampler, float3(0,1,0)).rgb, 1);               
141    I += 0.5 * Le * Poly2Point_Contr( float3( 0,1,0), float3( -0.5,1,0.5), float3(0.5,1,0.5), float3(0.5,1,-0.5), float3(-0.5,1,-0.5), pos, N, DistanceEnvMapSampler); 
142       
143    Le = float4(readCubeMap(SmallEnvMapSampler, float3(0,-1,0)).rgb, 1);               
144    I += 0.5 * Le * Poly2Point_Contr( float3( 0,-1,0), float3( -0.5,-1,-0.5), float3(0.5,-1,-0.5), float3(0.5,-1,0.5), float3(-0.5,-1,0.5), pos, N, DistanceEnvMapSampler);     
145
146    Le = float4(readCubeMap(SmallEnvMapSampler, float3(0,0,1)).rgb, 1);         
147    I += 0.5 * Le * Poly2Point_Contr( float3( 0,0,1), float3( -0.5,-0.5,1), float3(0.5,-0.5,1), float3(0.5,0.5,1), float3(-0.5,0.5,1), pos, N, DistanceEnvMapSampler); 
148
149    Le = float4(readCubeMap(SmallEnvMapSampler, float3(0,0,-1)).rgb, 1);               
150    I += 0.5 * Le * Poly2Point_Contr( float3( 0,0,-1), float3( 0.5,-0.5,-1), float3(-0.5,-0.5,-1), float3(-0.5,0.5,-1), float3(0.5,0.5,-1), pos, N, DistanceEnvMapSampler);     
151
152    float kd = 0.32;                                                                                                                                           
153        return kd * I;
154}
Note: See TracBrowser for help on using the repository browser.