source: GTP/trunk/App/Demos/Illum/Shark3D/version164x12u/IllumDemo/src/res/levelutil/shader/prog/ogl_glsl/include_shmap_filter_ogl_glsl_vs1x0.s3d_shadercode @ 2196

Revision 2196, 5.5 KB checked in by szirmay, 17 years ago (diff)
Line 
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
25float 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
Note: See TracBrowser for help on using the repository browser.