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_OGL_GLSL_SC
|
---|
15 | @define SHMAP_FILTER_OGL_GLSL_SC
|
---|
16 |
|
---|
17 | ///////////////////////////////////////////////////////////////////////////////
|
---|
18 |
|
---|
19 | @ifndef S3D_SHMAP_ZBIAS
|
---|
20 | @define S3D_SHMAP_ZBIAS 0.0
|
---|
21 | @endif
|
---|
22 |
|
---|
23 | ///////////////////////////////////////////////////////////////////////////////
|
---|
24 |
|
---|
25 | float s3d_shmapFilter(
|
---|
26 | sampler2D lightShmapSamp,
|
---|
27 | vec4 lightShmapCoord,
|
---|
28 | vec4 lightShmapSize,
|
---|
29 | vec4 lightShmapRcpSize)
|
---|
30 | {
|
---|
31 | @ifdef S3D_SHMAP_FILTER16
|
---|
32 | vec2 shmapCoordRaw
|
---|
33 | = lightShmapCoord.xy * lightShmapSize.xy / lightShmapCoord.w;
|
---|
34 | vec2 shmapCoordFull = shmapCoordRaw + vec2(0.5, 0.5);
|
---|
35 | vec2 shmapCoordBase = floor(shmapCoordFull);
|
---|
36 | vec2 shmapCoordFrac = shmapCoordFull - shmapCoordBase;
|
---|
37 | vec4 shmapCoordBaseAB = lightShmapRcpSize.xyxy * (
|
---|
38 | shmapCoordBase.xyxy + vec4(-1.5, 0, -0.5, 0));
|
---|
39 | vec4 shmapCoordBaseCD = lightShmapRcpSize.xyxy * (
|
---|
40 | shmapCoordBase.xyxy + vec4(+0.5, 0, +1.5, 0));
|
---|
41 | vec4 shmapDeltaXY = lightShmapRcpSize.xyxy * vec4(0, -1.5, 0, -0.5);
|
---|
42 | vec4 shmapDeltaZW = lightShmapRcpSize.xyxy * vec4(0, +0.5, 0, +1.5);
|
---|
43 |
|
---|
44 | vec4 shmapCoordAXY = shmapCoordBaseAB.xyxy + shmapDeltaXY.xyzw;
|
---|
45 | vec4 shmapCoordAZW = shmapCoordBaseAB.xyxy + shmapDeltaZW.xyzw;
|
---|
46 | vec4 shmapValA;
|
---|
47 | shmapValA.x = texture2D(lightShmapSamp, shmapCoordAXY.xy).x;
|
---|
48 | shmapValA.y = texture2D(lightShmapSamp, shmapCoordAXY.zw).x;
|
---|
49 | shmapValA.z = texture2D(lightShmapSamp, shmapCoordAZW.xy).x;
|
---|
50 | shmapValA.w = texture2D(lightShmapSamp, shmapCoordAZW.zw).x;
|
---|
51 | vec4 shmapCoordBXY = shmapCoordBaseAB.zwzw + shmapDeltaXY.xyzw;
|
---|
52 | vec4 shmapCoordBZW = shmapCoordBaseAB.zwzw + shmapDeltaZW.xyzw;
|
---|
53 | vec4 shmapValB;
|
---|
54 | shmapValB.x = texture2D(lightShmapSamp, shmapCoordBXY.xy).x;
|
---|
55 | shmapValB.y = texture2D(lightShmapSamp, shmapCoordBXY.zw).x;
|
---|
56 | shmapValB.z = texture2D(lightShmapSamp, shmapCoordBZW.xy).x;
|
---|
57 | shmapValB.w = texture2D(lightShmapSamp, shmapCoordBZW.zw).x;
|
---|
58 | vec4 shmapCoordCXY = shmapCoordBaseCD.xyxy + shmapDeltaXY.xyzw;
|
---|
59 | vec4 shmapCoordCZW = shmapCoordBaseCD.xyxy + shmapDeltaZW.xyzw;
|
---|
60 | vec4 shmapValC;
|
---|
61 | shmapValC.x = texture2D(lightShmapSamp, shmapCoordCXY.xy).x;
|
---|
62 | shmapValC.y = texture2D(lightShmapSamp, shmapCoordCXY.zw).x;
|
---|
63 | shmapValC.z = texture2D(lightShmapSamp, shmapCoordCZW.xy).x;
|
---|
64 | shmapValC.w = texture2D(lightShmapSamp, shmapCoordCZW.zw).x;
|
---|
65 | vec4 shmapCoordDXY = shmapCoordBaseCD.zwzw + shmapDeltaXY.xyzw;
|
---|
66 | vec4 shmapCoordDZW = shmapCoordBaseCD.zwzw + shmapDeltaZW.xyzw;
|
---|
67 | vec4 shmapValD;
|
---|
68 | shmapValD.x = texture2D(lightShmapSamp, shmapCoordDXY.xy).x;
|
---|
69 | shmapValD.y = texture2D(lightShmapSamp, shmapCoordDXY.zw).x;
|
---|
70 | shmapValD.z = texture2D(lightShmapSamp, shmapCoordDZW.xy).x;
|
---|
71 | shmapValD.w = texture2D(lightShmapSamp, shmapCoordDZW.zw).x;
|
---|
72 |
|
---|
73 | vec4 brightA = step(lightShmapCoord.zzzz,
|
---|
74 | (shmapValA + S3D_SHMAP_ZBIAS) * lightShmapCoord.w);
|
---|
75 | vec4 brightB = step(lightShmapCoord.zzzz,
|
---|
76 | (shmapValB + S3D_SHMAP_ZBIAS) * lightShmapCoord.w);
|
---|
77 | vec4 brightC = step(lightShmapCoord.zzzz,
|
---|
78 | (shmapValC + S3D_SHMAP_ZBIAS) * lightShmapCoord.w);
|
---|
79 | vec4 brightD = step(lightShmapCoord.zzzz,
|
---|
80 | (shmapValD + S3D_SHMAP_ZBIAS) * lightShmapCoord.w);
|
---|
81 | vec4 sumRow = brightA + brightB + brightC
|
---|
82 | + shmapCoordFrac.x * (brightD - brightA);
|
---|
83 | vec4 colWghBase = vec4(1.0 / 9.0, 1.0 / 9.0, 1.0 / 9.0, 0);
|
---|
84 | vec4 colWghDelta = vec4(-1.0 / 9.0, 0, 0, 1.0 / 9.0);
|
---|
85 | vec4 colWgh = colWghBase + shmapCoordFrac.y * colWghDelta;
|
---|
86 | float bright = dot(sumRow, colWgh);
|
---|
87 | @else
|
---|
88 | @ifdef S3D_SHMAP_FILTER4
|
---|
89 | vec4 shmapCoordRaw
|
---|
90 | = lightShmapCoord.xy * lightShmapSize / lightShmapCoord.w;
|
---|
91 | vec4 shmapCoordFull = shmapCoordRaw + vec4(0.5, 0.5);
|
---|
92 | vec4 shmapCoordBase = floor(shmapCoordFull);
|
---|
93 | vec4 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,
|
---|
108 | (shmapVec + S3D_SHMAP_ZBIAS) * lightShmapCoord.w);
|
---|
109 | vec4 sumRow = brightVec.xy
|
---|
110 | + shmapCoordFrac.x * (brightVec.zw - brightVec.xy);
|
---|
111 | float bright = sumRow.x
|
---|
112 | + shmapCoordFrac.y * (sumRow.y - sumRow.x);
|
---|
113 | @else
|
---|
114 | float shmapVal = texture2DProj(lightShmapSamp, lightShmapCoord.xyzw).x;
|
---|
115 | float bright = step(lightShmapCoord.z,
|
---|
116 | (shmapVal + S3D_SHMAP_ZBIAS) * lightShmapCoord.w);
|
---|
117 | @endif
|
---|
118 | @endif
|
---|
119 | return bright;
|
---|
120 | }
|
---|
121 |
|
---|
122 | ///////////////////////////////////////////////////////////////////////////////
|
---|
123 |
|
---|
124 | @endif
|
---|