[2453] | 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_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
|
---|