1 | struct VS_OUT
|
---|
2 | {
|
---|
3 | float4 hPosition : POSITION;
|
---|
4 | float4 color : COLOR0;
|
---|
5 | };
|
---|
6 |
|
---|
7 | VS_OUT CauVS(float4 position : POSITION,
|
---|
8 | float4 texCoord : TEXCOORD0,
|
---|
9 | float4 color : COLOR0,
|
---|
10 | uniform float4x4 worldView,
|
---|
11 | uniform float4x4 Proj,
|
---|
12 | uniform float resolution,
|
---|
13 | uniform sampler2D PhotonHitMap : register(s0))
|
---|
14 | {
|
---|
15 | VS_OUT OUT;
|
---|
16 |
|
---|
17 | float4 cPosition;
|
---|
18 | float pixel = 1.0 / 32.0;
|
---|
19 | float2 uv = float2(position.x, 1.0 - position.y);
|
---|
20 | float4 pos = tex2Dlod(PhotonHitMap, float4(uv,0,0)).rgba;
|
---|
21 |
|
---|
22 | if(pos.a == 0)//no photon hit
|
---|
23 | {
|
---|
24 | OUT.color = float4(0,0,0,0);
|
---|
25 | OUT.hPosition = float4(0, 0, -1000000, 1);
|
---|
26 | }
|
---|
27 | else
|
---|
28 | {
|
---|
29 | float4 wPosition = float4(normalize(pos.xyz),1);
|
---|
30 | cPosition = mul(worldView, wPosition);
|
---|
31 | OUT.hPosition = mul(Proj, cPosition);
|
---|
32 |
|
---|
33 | float intensity = 0.25;
|
---|
34 |
|
---|
35 | //read four neighbours
|
---|
36 | float sumdist = 0;
|
---|
37 | float dist;
|
---|
38 | float valids = 0;
|
---|
39 | float4 pos1 = tex2Dlod(PhotonHitMap, float4(uv + float2(pixel, pixel),0,0));
|
---|
40 | if(pos1.a != 0)
|
---|
41 | {
|
---|
42 | dist = length(pos1.xyz - pos.xyz);
|
---|
43 | sumdist += dist;
|
---|
44 | valids++;
|
---|
45 | }
|
---|
46 |
|
---|
47 | float4 pos2 = tex2Dlod(PhotonHitMap, float4(uv + float2(-pixel, pixel),0,0));
|
---|
48 | if(pos2.a != 0)
|
---|
49 | {
|
---|
50 | dist = length(pos2.xyz - pos.xyz);
|
---|
51 | sumdist += dist;
|
---|
52 | valids++;
|
---|
53 | }
|
---|
54 |
|
---|
55 | float4 pos3 = tex2Dlod(PhotonHitMap, float4(uv + float2(pixel, -pixel),0,0));
|
---|
56 | if(pos3.a != 0)
|
---|
57 | {
|
---|
58 | dist = length(pos3.xyz - pos.xyz);
|
---|
59 | sumdist += dist;
|
---|
60 | valids++;
|
---|
61 | }
|
---|
62 |
|
---|
63 | float4 pos4 = tex2Dlod(PhotonHitMap, float4(uv + float2(-pixel, -pixel),0,0));
|
---|
64 | if(pos4.a != 0)
|
---|
65 | {
|
---|
66 | dist = length(pos4.xyz - pos.xyz);
|
---|
67 | sumdist += dist;
|
---|
68 | valids++;
|
---|
69 | }
|
---|
70 | //if(valids == 0) sumdist = 100000;
|
---|
71 | float avrdist = sumdist / valids;
|
---|
72 | //float maxdist = 10;
|
---|
73 | //intensity = max(maxdist - avrdist, 0.0) / maxdist;
|
---|
74 | intensity = 60.0 / (avrdist * avrdist * 3.14);
|
---|
75 | //intensity = valids / 4.0;//avrdist;
|
---|
76 |
|
---|
77 | //OUT.color = float4(1,1,1,intensity);
|
---|
78 | OUT.color = intensity;
|
---|
79 | }
|
---|
80 |
|
---|
81 | return OUT;
|
---|
82 | }
|
---|
83 |
|
---|
84 |
|
---|
85 | float4 CauPS(VS_OUT IN,
|
---|
86 | uniform float3 color ):COLOR
|
---|
87 | {
|
---|
88 | return IN.color * float4(color, 1);
|
---|
89 | }
|
---|
90 |
|
---|
91 |
|
---|