[777] | 1 | float CauSpriteSize;
|
---|
| 2 | float CauSpriteIntens;
|
---|
| 3 |
|
---|
| 4 | struct VS_OUT
|
---|
| 5 | {
|
---|
| 6 | float4 hPosition : POSITION;
|
---|
| 7 | float4 texCoord : TEXCOORD0;
|
---|
| 8 | float4 color : COLOR0;
|
---|
| 9 | float2 r : TEXCOORD1;
|
---|
| 10 | float2 center : TEXCOORD2;
|
---|
| 11 | float4 position : TEXCOORD3;
|
---|
| 12 | };
|
---|
| 13 |
|
---|
| 14 | VS_OUT CauVS(float4 position : POSITION,
|
---|
| 15 | float4 texCoord : TEXCOORD0,
|
---|
| 16 | float4 color : COLOR0,
|
---|
| 17 | uniform float4x4 worldView,
|
---|
| 18 | uniform float4x4 Proj,
|
---|
| 19 | uniform float4x4 worldViewProj,
|
---|
| 20 | uniform float resolution,
|
---|
| 21 | uniform sampler2D PhotonHitMap : register(s0))
|
---|
| 22 | {
|
---|
| 23 | VS_OUT OUT;
|
---|
| 24 |
|
---|
| 25 | float radius = CauSpriteSize;
|
---|
| 26 | float2 offset = 2.0 * texCoord.zw * radius;
|
---|
| 27 |
|
---|
| 28 | float4 cPosition;
|
---|
| 29 |
|
---|
| 30 | float4 pos = tex2Dlod(PhotonHitMap, float4(position.x, 1.0 - position.y,0,0)).rgba;
|
---|
[807] | 31 | if(pos.a == 0)//no photon hit
|
---|
[777] | 32 | {
|
---|
| 33 | OUT.center = 1000.0f;
|
---|
| 34 | OUT.position = OUT.hPosition = 1000.0f; //transform out of view
|
---|
| 35 | }
|
---|
| 36 | else
|
---|
| 37 | {
|
---|
| 38 | float4 wPosition = float4(normalize(pos.xyz),1);
|
---|
| 39 |
|
---|
| 40 | cPosition = mul(worldView, wPosition);
|
---|
| 41 | OUT.center = cPosition.xy;
|
---|
| 42 | cPosition.xy += offset;
|
---|
| 43 | OUT.position = cPosition;
|
---|
| 44 | OUT.hPosition = mul(Proj, cPosition);
|
---|
| 45 |
|
---|
| 46 | /*
|
---|
| 47 | //rotate to camera
|
---|
| 48 | cPosition = mul(worldView, wPosition);
|
---|
| 49 |
|
---|
| 50 | float3 C = cPosition.xyz;
|
---|
| 51 | float3 right = cross(C, float3(0,1,0));
|
---|
| 52 | float3 up = cross(right, C);
|
---|
| 53 |
|
---|
| 54 | float3 cOffset = offset.x * right + offset.y * up;
|
---|
| 55 | cPosition.xy += float2(-0.5/resolution, -0.5/resolution);
|
---|
| 56 | OUT.center = cPosition.xy;
|
---|
| 57 | cPosition.xyz += cOffset;
|
---|
| 58 | OUT.position = cPosition;
|
---|
| 59 | OUT.hPosition = mul(Proj, cPosition);
|
---|
| 60 | */
|
---|
| 61 | }
|
---|
| 62 |
|
---|
| 63 | OUT.r.x = abs(offset.x);
|
---|
| 64 | OUT.r.y = radius;
|
---|
| 65 | OUT.texCoord = texCoord;
|
---|
| 66 | OUT.color = 1;
|
---|
| 67 |
|
---|
| 68 | return OUT;
|
---|
| 69 | }
|
---|
| 70 |
|
---|
| 71 |
|
---|
| 72 | float4 CauPS(VS_OUT IN,
|
---|
| 73 | uniform sampler2D intensityTex : register(s1)
|
---|
| 74 | ):COLOR
|
---|
| 75 | {
|
---|
| 76 |
|
---|
| 77 | float2 texcoord = (IN.center - IN.position.xy) / IN.r.x;
|
---|
| 78 | texcoord = (texcoord + 1.0) * 0.5;
|
---|
| 79 | float intens = tex2D(intensityTex, texcoord).r;
|
---|
[916] | 80 | IN.color = intens * CauSpriteIntens;
|
---|
[777] | 81 |
|
---|
| 82 | return IN.color;
|
---|
| 83 |
|
---|
| 84 | }
|
---|
| 85 |
|
---|
| 86 |
|
---|