1 |
|
---|
2 | #define CUBEMAP_SIZE 64
|
---|
3 | #define REDUCED_CUBEMAP_SIZE 2
|
---|
4 | #define RATE 32
|
---|
5 |
|
---|
6 | float4 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 |
|
---|
13 | float 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 | ///////////////////////////
|
---|
23 | struct MPos_OUT
|
---|
24 | {
|
---|
25 | float4 VPos : POSITION;
|
---|
26 | float4 MPos : TEXCOORD0;
|
---|
27 | };
|
---|
28 |
|
---|
29 | float4 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 |
|
---|
63 | float4 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 |
|
---|
112 | struct Shaded_OUT
|
---|
113 | {
|
---|
114 | float4 vPos : POSITION;
|
---|
115 | float4 wNormal : TEXCOORD0;
|
---|
116 | float4 wPos : TEXCOORD1;
|
---|
117 | };
|
---|
118 |
|
---|
119 | float4 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 | } |
---|