1 |
|
---|
2 | float readDistanceCubeMap(samplerCUBE dcm, float3 coord)
|
---|
3 | {
|
---|
4 | float dist = texCUBE(dcm, float3(coord.xy, - coord.z)).r;
|
---|
5 | if(dist == 0) dist = 10000; ///sky
|
---|
6 | return dist;
|
---|
7 | }
|
---|
8 |
|
---|
9 | struct VertOut
|
---|
10 | {
|
---|
11 | float4 hPosition :POSITION;
|
---|
12 | float2 texCoord :TEXCOORD;
|
---|
13 | float3 wPosition :TEXCOORD1;
|
---|
14 | };
|
---|
15 |
|
---|
16 |
|
---|
17 | VertOut deaultVS(float4 position : POSITION,
|
---|
18 | float2 texCoord : TEXCOORD0,
|
---|
19 | uniform float4x4 worldViewProj,
|
---|
20 | uniform float4x4 world)
|
---|
21 | {
|
---|
22 | VertOut OUT;
|
---|
23 | OUT.texCoord = texCoord;
|
---|
24 | OUT.hPosition = mul(worldViewProj, position);
|
---|
25 | OUT.wPosition = mul(world, position).xyz;
|
---|
26 | return OUT;
|
---|
27 | }
|
---|
28 |
|
---|
29 | float4 deaultPS(VertOut IN,
|
---|
30 | uniform samplerCUBE CubeMap : register(s0),
|
---|
31 | uniform samplerCUBE distanceCube : register(s1),
|
---|
32 | uniform float3 cubeMapCameraPosition,
|
---|
33 | uniform float attenuation):COLOR
|
---|
34 | {
|
---|
35 | float4 Color = float4(1,1,1,1);
|
---|
36 |
|
---|
37 | float3 dir = IN.wPosition - cubeMapCameraPosition;
|
---|
38 | float4 caustic = texCUBE(CubeMap, float3(dir.xy,-dir.z) );
|
---|
39 | float mydist = length(dir);
|
---|
40 | float dist = readDistanceCubeMap(distanceCube, dir);
|
---|
41 |
|
---|
42 | float EPSILON = 0.1;
|
---|
43 |
|
---|
44 | //if(mydist > dist + EPSILON) caustic = 0;
|
---|
45 | caustic *= max(attenuation - mydist, 0) / attenuation;
|
---|
46 |
|
---|
47 | Color = caustic;
|
---|
48 |
|
---|
49 | return Color;
|
---|
50 | } |
---|