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

Revision 2196, 5.4 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_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
25float 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
Note: See TracBrowser for help on using the repository browser.