[777] | 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),
|
---|
[1085] | 32 | uniform float3 cubeMapCameraPosition,
|
---|
| 33 | uniform float attenuation):COLOR
|
---|
[777] | 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 |
|
---|
[1094] | 42 | float EPSILON = 1.0;
|
---|
[777] | 43 |
|
---|
[1094] | 44 | if(mydist > dist + EPSILON) caustic = 0;
|
---|
| 45 | //caustic.rgb *= max(attenuation - mydist, 0.0) / attenuation;
|
---|
| 46 |
|
---|
[777] | 47 | Color = caustic;
|
---|
[1094] | 48 | Color += attenuation;
|
---|
| 49 | Color.a = 1;
|
---|
[777] | 50 | return Color;
|
---|
| 51 | } |
---|