source: GTP/trunk/App/Demos/Illum/Shark3D/version164x12u/IllumDemo/src/res/levelutil/shader/prog/d3d9_hlsl/include_shmap_filter_d3d9_hlsl.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_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_SHMAP_FILTER16
32    float2 shmapCoordRaw
33            = lightShmapCoord.xy * lightShmapSize / lightShmapCoord.w;
34    float2 shmapCoordFull = shmapCoordRaw + float2(0.5, 0.5);
35    float2 shmapCoordBase = floor(shmapCoordFull);
36    float2 shmapCoordFrac = shmapCoordFull - shmapCoordBase;
37    float4 shmapCoordBaseAB = lightShmapRcpSize.xyxy * (
38            shmapCoordBase.xyxy + float4(-1.5, 0, -0.5, 0));
39    float4 shmapCoordBaseCD = lightShmapRcpSize.xyxy * (
40            shmapCoordBase.xyxy + float4(+0.5, 0, +1.5, 0));
41    float4 shmapDeltaXY = lightShmapRcpSize.xyxy * float4(0, -1.5, 0, -0.5);
42    float4 shmapDeltaZW = lightShmapRcpSize.xyxy * float4(0, +0.5, 0, +1.5);
43
44    float4 shmapCoordAXY = shmapCoordBaseAB.xyxy + shmapDeltaXY.xyzw;
45    float4 shmapCoordAZW = shmapCoordBaseAB.xyxy + shmapDeltaZW.xyzw;
46    float4 shmapValA;
47    shmapValA.x = tex2D(lightShmapSamp, shmapCoordAXY.xy).x;
48    shmapValA.y = tex2D(lightShmapSamp, shmapCoordAXY.zw).x;
49    shmapValA.z = tex2D(lightShmapSamp, shmapCoordAZW.xy).x;
50    shmapValA.w = tex2D(lightShmapSamp, shmapCoordAZW.zw).x;
51    float4 shmapCoordBXY = shmapCoordBaseAB.zwzw + shmapDeltaXY.xyzw;
52    float4 shmapCoordBZW = shmapCoordBaseAB.zwzw + shmapDeltaZW.xyzw;
53    float4 shmapValB;
54    shmapValB.x = tex2D(lightShmapSamp, shmapCoordBXY.xy).x;
55    shmapValB.y = tex2D(lightShmapSamp, shmapCoordBXY.zw).x;
56    shmapValB.z = tex2D(lightShmapSamp, shmapCoordBZW.xy).x;
57    shmapValB.w = tex2D(lightShmapSamp, shmapCoordBZW.zw).x;
58    float4 shmapCoordCXY = shmapCoordBaseCD.xyxy + shmapDeltaXY.xyzw;
59    float4 shmapCoordCZW = shmapCoordBaseCD.xyxy + shmapDeltaZW.xyzw;
60    float4 shmapValC;
61    shmapValC.x = tex2D(lightShmapSamp, shmapCoordCXY.xy).x;
62    shmapValC.y = tex2D(lightShmapSamp, shmapCoordCXY.zw).x;
63    shmapValC.z = tex2D(lightShmapSamp, shmapCoordCZW.xy).x;
64    shmapValC.w = tex2D(lightShmapSamp, shmapCoordCZW.zw).x;
65    float4 shmapCoordDXY = shmapCoordBaseCD.zwzw + shmapDeltaXY.xyzw;
66    float4 shmapCoordDZW = shmapCoordBaseCD.zwzw + shmapDeltaZW.xyzw;
67    float4 shmapValD;
68    shmapValD.x = tex2D(lightShmapSamp, shmapCoordDXY.xy).x;
69    shmapValD.y = tex2D(lightShmapSamp, shmapCoordDXY.zw).x;
70    shmapValD.z = tex2D(lightShmapSamp, shmapCoordDZW.xy).x;
71    shmapValD.w = tex2D(lightShmapSamp, shmapCoordDZW.zw).x;
72   
73    float4 brightA = step(lightShmapCoord.zzzz,
74            (shmapValA + S3D_SHMAP_ZBIAS) * lightShmapCoord.w);
75    float4 brightB = step(lightShmapCoord.zzzz,
76            (shmapValB + S3D_SHMAP_ZBIAS) * lightShmapCoord.w);
77    float4 brightC = step(lightShmapCoord.zzzz,
78            (shmapValC + S3D_SHMAP_ZBIAS) * lightShmapCoord.w);
79    float4 brightD = step(lightShmapCoord.zzzz,
80            (shmapValD + S3D_SHMAP_ZBIAS) * lightShmapCoord.w);
81    float4 sumRow = brightA + brightB + brightC
82            + shmapCoordFrac.x * (brightD - brightA);
83    float4 colWghBase = float4(1.0 / 9.0, 1.0 / 9.0, 1.0 / 9.0, 0);
84    float4 colWghDelta = float4(-1.0 / 9.0, 0, 0, 1.0 / 9.0);
85    float4 colWgh = colWghBase + shmapCoordFrac.y * colWghDelta;
86    float bright = dot(sumRow, colWgh);
87#else
88#ifdef S3D_SHMAP_FILTER4
89    float2 shmapCoordRaw
90            = lightShmapCoord.xy * lightShmapSize / lightShmapCoord.w;
91    float2 shmapCoordFull = shmapCoordRaw + float2(0.5, 0.5);
92    float2 shmapCoordBase = floor(shmapCoordFull);
93    float2 shmapCoordFrac = shmapCoordFull - shmapCoordBase;
94    float4 shmapCoordBaseAB = lightShmapRcpSize.xyxy * (
95            shmapCoordBase.xyxy + float4(-0.5, 0, +0.5, 0));
96    float4 shmapDelta = lightShmapRcpSize.xyxy * float4(0, -0.5, 0, +0.5);
97
98    float4 shmapCoordA = shmapCoordBaseAB.xyxy + shmapDelta.xyzw;
99    float4 shmapCoordB = shmapCoordBaseAB.zwzw + shmapDelta.xyzw;
100    float4 shmapVec;
101    shmapVec.x = tex2D(lightShmapSamp, shmapCoordA.xy).x;
102    shmapVec.y = tex2D(lightShmapSamp, shmapCoordA.zw).x;
103    shmapVec.z = tex2D(lightShmapSamp, shmapCoordB.xy).x;
104    shmapVec.w = tex2D(lightShmapSamp, shmapCoordB.zw).x;
105   
106    float4 brightVec
107        = step(lightShmapCoord.zzzz,
108            (shmapVec + S3D_SHMAP_ZBIAS) * lightShmapCoord.w);
109    float2 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 = tex2Dproj(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.