1 | ///////////////////////////////////////////////////////////////////////////////
|
---|
2 | //
|
---|
3 | // ## ######
|
---|
4 | // ###### ###
|
---|
5 | // ## ############### Shark 3D Engine (www.shark3d.com)
|
---|
6 | // ########## # # #
|
---|
7 | // ######## Copyright (c) 1996-2006 Spinor GmbH.
|
---|
8 | // ######### # # # All rights reserved.
|
---|
9 | // ## ##########
|
---|
10 | // ##
|
---|
11 | //
|
---|
12 | ///////////////////////////////////////////////////////////////////////////////
|
---|
13 |
|
---|
14 | #ifndef SHMAP_FILTER_D3D9_HLSL_SC
|
---|
15 | #define SHMAP_FILTER_D3D9_HLSL_SC
|
---|
16 |
|
---|
17 | ///////////////////////////////////////////////////////////////////////////////
|
---|
18 |
|
---|
19 | #ifndef S3D_SHMAP_ZBIAS
|
---|
20 | #define S3D_SHMAP_ZBIAS 0
|
---|
21 | #endif
|
---|
22 |
|
---|
23 | ///////////////////////////////////////////////////////////////////////////////
|
---|
24 |
|
---|
25 | float s3d_shmapFilter(
|
---|
26 | sampler lightShmapSamp,
|
---|
27 | float4 lightShmapCoord,
|
---|
28 | float4 lightShmapSize,
|
---|
29 | float4 lightShmapRcpSize)
|
---|
30 | {
|
---|
31 | @ifdef S3D_LIGHT_SHMAP
|
---|
32 | float shmapVal = s3d_shmapFilter(
|
---|
33 | lightShmapSamp, lightShmapCoord,
|
---|
34 | lightShmapSize, lightShmapRcpSize);
|
---|
35 | @ifdef S3D_SHMAP_FILTER16
|
---|
36 | vec2 shmapCoordRaw
|
---|
37 | = lightShmapCoord.xy * lightShmapSize.xy / lightShmapCoord.w;
|
---|
38 | vec2 shmapCoordFull = shmapCoordRaw + vec2(0.5, 0.5);
|
---|
39 | vec2 shmapCoordBase = floor(shmapCoordFull);
|
---|
40 | vec2 shmapCoordFrac = shmapCoordFull - shmapCoordBase;
|
---|
41 | vec4 shmapCoordBaseAB = lightShmapRcpSize.xyxy * (
|
---|
42 | shmapCoordBase.xyxy + vec4(-1.5, 0, -0.5, 0));
|
---|
43 | vec4 shmapCoordBaseCD = lightShmapRcpSize.xyxy * (
|
---|
44 | shmapCoordBase.xyxy + vec4(+0.5, 0, +1.5, 0));
|
---|
45 | vec4 shmapDeltaXY = lightShmapRcpSize.xyxy * vec4(0, -1.5, 0, -0.5);
|
---|
46 | vec4 shmapDeltaZW = lightShmapRcpSize.xyxy * vec4(0, +0.5, 0, +1.5);
|
---|
47 |
|
---|
48 | vec4 shmapCoordAXY = shmapCoordBaseAB.xyxy + shmapDeltaXY.xyzw;
|
---|
49 | vec4 shmapCoordAZW = shmapCoordBaseAB.xyxy + shmapDeltaZW.xyzw;
|
---|
50 | vec4 shmapValA;
|
---|
51 | shmapValA.x = texture2D(lightShmapSamp, shmapCoordAXY.xy).x;
|
---|
52 | shmapValA.y = texture2D(lightShmapSamp, shmapCoordAXY.zw).x;
|
---|
53 | shmapValA.z = texture2D(lightShmapSamp, shmapCoordAZW.xy).x;
|
---|
54 | shmapValA.w = texture2D(lightShmapSamp, shmapCoordAZW.zw).x;
|
---|
55 | vec4 shmapCoordBXY = shmapCoordBaseAB.zwzw + shmapDeltaXY.xyzw;
|
---|
56 | vec4 shmapCoordBZW = shmapCoordBaseAB.zwzw + shmapDeltaZW.xyzw;
|
---|
57 | vec4 shmapValB;
|
---|
58 | shmapValB.x = texture2D(lightShmapSamp, shmapCoordBXY.xy).x;
|
---|
59 | shmapValB.y = texture2D(lightShmapSamp, shmapCoordBXY.zw).x;
|
---|
60 | shmapValB.z = texture2D(lightShmapSamp, shmapCoordBZW.xy).x;
|
---|
61 | shmapValB.w = texture2D(lightShmapSamp, shmapCoordBZW.zw).x;
|
---|
62 | vec4 shmapCoordCXY = shmapCoordBaseCD.xyxy + shmapDeltaXY.xyzw;
|
---|
63 | vec4 shmapCoordCZW = shmapCoordBaseCD.xyxy + shmapDeltaZW.xyzw;
|
---|
64 | vec4 shmapValC;
|
---|
65 | shmapValC.x = texture2D(lightShmapSamp, shmapCoordCXY.xy).x;
|
---|
66 | shmapValC.y = texture2D(lightShmapSamp, shmapCoordCXY.zw).x;
|
---|
67 | shmapValC.z = texture2D(lightShmapSamp, shmapCoordCZW.xy).x;
|
---|
68 | shmapValC.w = texture2D(lightShmapSamp, shmapCoordCZW.zw).x;
|
---|
69 | vec4 shmapCoordDXY = shmapCoordBaseCD.zwzw + shmapDeltaXY.xyzw;
|
---|
70 | vec4 shmapCoordDZW = shmapCoordBaseCD.zwzw + shmapDeltaZW.xyzw;
|
---|
71 | vec4 shmapValD;
|
---|
72 | shmapValD.x = texture2D(lightShmapSamp, shmapCoordDXY.xy).x;
|
---|
73 | shmapValD.y = texture2D(lightShmapSamp, shmapCoordDXY.zw).x;
|
---|
74 | shmapValD.z = texture2D(lightShmapSamp, shmapCoordDZW.xy).x;
|
---|
75 | shmapValD.w = texture2D(lightShmapSamp, shmapCoordDZW.zw).x;
|
---|
76 |
|
---|
77 | vec4 brightA = step(lightShmapCoord.zzzz, shmapValA * lightShmapCoord.w);
|
---|
78 | vec4 brightB = step(lightShmapCoord.zzzz, shmapValB * lightShmapCoord.w);
|
---|
79 | vec4 brightC = step(lightShmapCoord.zzzz, shmapValC * lightShmapCoord.w);
|
---|
80 | vec4 brightD = step(lightShmapCoord.zzzz, shmapValD * lightShmapCoord.w);
|
---|
81 | vec4 sumRow = brightA + brightB + brightC
|
---|
82 | + shmapCoordFrac.x * (brightD - brightA);
|
---|
83 | vec4 colWgh = vec4(1, 1, 1, 0)
|
---|
84 | + shmapCoordFrac.y * vec4(-1, 0, 0, 1);
|
---|
85 | float sum = dot(sumRow, colWgh);
|
---|
86 | float shmapVal = sum * (1.0 / 9.0);
|
---|
87 | @else
|
---|
88 | @ifdef S3D_SHMAP_FILTER4
|
---|
89 | vec2 shmapCoordRaw
|
---|
90 | = lightShmapCoord.xy * lightShmapSize.xy / lightShmapCoord.w;
|
---|
91 | vec2 shmapCoordFull = shmapCoordRaw + vec2(0.5, 0.5);
|
---|
92 | vec2 shmapCoordBase = floor(shmapCoordFull);
|
---|
93 | vec2 shmapCoordFrac = shmapCoordFull - shmapCoordBase;
|
---|
94 | vec4 shmapCoordBaseAB = lightShmapRcpSize.xyxy * (
|
---|
95 | shmapCoordBase.xyxy + vec4(-0.5, 0, +0.5, 0));
|
---|
96 | vec4 shmapDelta = lightShmapRcpSize.xyxy * vec4(0, -0.5, 0, +0.5);
|
---|
97 |
|
---|
98 | vec4 shmapCoordA = shmapCoordBaseAB.xyxy + shmapDelta.xyzw;
|
---|
99 | vec4 shmapCoordB = shmapCoordBaseAB.zwzw + shmapDelta.xyzw;
|
---|
100 | vec4 shmapVec;
|
---|
101 | shmapVec.x = texture2D(lightShmapSamp, shmapCoordA.xy).x;
|
---|
102 | shmapVec.y = texture2D(lightShmapSamp, shmapCoordA.zw).x;
|
---|
103 | shmapVec.z = texture2D(lightShmapSamp, shmapCoordB.xy).x;
|
---|
104 | shmapVec.w = texture2D(lightShmapSamp, shmapCoordB.zw).x;
|
---|
105 |
|
---|
106 | vec4 brightVec
|
---|
107 | = step(lightShmapCoord.zzzz, shmapVec * lightShmapCoord.w);
|
---|
108 | vec2 sumRow = brightVec.xy
|
---|
109 | + shmapCoordFrac.x * (brightVec.zw - brightVec.xy);
|
---|
110 | float shmapVal = sumRow.x
|
---|
111 | + shmapCoordFrac.y * (sumRow.y - sumRow.x);
|
---|
112 | @else
|
---|
113 | float shmapVal = texture2DProj(lightShmapSamp, lightShmapCoord.xyw).x;
|
---|
114 | float shmapVal = step(lightShmapCoord.z,
|
---|
115 | shmapVal * lightShmapCoord.w);
|
---|
116 | @endif
|
---|
117 | @endif
|
---|
118 | @endif
|
---|
119 | }
|
---|
120 |
|
---|
121 | ///////////////////////////////////////////////////////////////////////////////
|
---|
122 |
|
---|
123 | #endif
|
---|