/////////////////////////////////////////////////////////////////////////////// // // ## ###### // ###### ### // ## ############### Shark 3D Engine (www.shark3d.com) // ########## # # # // ######## Copyright (c) 1996-2006 Spinor GmbH. // ######### # # # All rights reserved. // ## ########## // ## // /////////////////////////////////////////////////////////////////////////////// #ifndef SHMAP_FILTER_D3D9_HLSL_SC #define SHMAP_FILTER_D3D9_HLSL_SC /////////////////////////////////////////////////////////////////////////////// #ifndef S3D_SHMAP_ZBIAS #define S3D_SHMAP_ZBIAS 0 #endif /////////////////////////////////////////////////////////////////////////////// float s3d_shmapFilter( sampler lightShmapSamp, float4 lightShmapCoord, float4 lightShmapSize, float4 lightShmapRcpSize) { #ifdef S3D_SHMAP_FILTER16 float2 shmapCoordRaw = lightShmapCoord.xy * lightShmapSize / lightShmapCoord.w; float2 shmapCoordFull = shmapCoordRaw + float2(0.5, 0.5); float2 shmapCoordBase = floor(shmapCoordFull); float2 shmapCoordFrac = shmapCoordFull - shmapCoordBase; float4 shmapCoordBaseAB = lightShmapRcpSize.xyxy * ( shmapCoordBase.xyxy + float4(-1.5, 0, -0.5, 0)); float4 shmapCoordBaseCD = lightShmapRcpSize.xyxy * ( shmapCoordBase.xyxy + float4(+0.5, 0, +1.5, 0)); float4 shmapDeltaXY = lightShmapRcpSize.xyxy * float4(0, -1.5, 0, -0.5); float4 shmapDeltaZW = lightShmapRcpSize.xyxy * float4(0, +0.5, 0, +1.5); float4 shmapCoordAXY = shmapCoordBaseAB.xyxy + shmapDeltaXY.xyzw; float4 shmapCoordAZW = shmapCoordBaseAB.xyxy + shmapDeltaZW.xyzw; float4 shmapValA; shmapValA.x = tex2D(lightShmapSamp, shmapCoordAXY.xy).x; shmapValA.y = tex2D(lightShmapSamp, shmapCoordAXY.zw).x; shmapValA.z = tex2D(lightShmapSamp, shmapCoordAZW.xy).x; shmapValA.w = tex2D(lightShmapSamp, shmapCoordAZW.zw).x; float4 shmapCoordBXY = shmapCoordBaseAB.zwzw + shmapDeltaXY.xyzw; float4 shmapCoordBZW = shmapCoordBaseAB.zwzw + shmapDeltaZW.xyzw; float4 shmapValB; shmapValB.x = tex2D(lightShmapSamp, shmapCoordBXY.xy).x; shmapValB.y = tex2D(lightShmapSamp, shmapCoordBXY.zw).x; shmapValB.z = tex2D(lightShmapSamp, shmapCoordBZW.xy).x; shmapValB.w = tex2D(lightShmapSamp, shmapCoordBZW.zw).x; float4 shmapCoordCXY = shmapCoordBaseCD.xyxy + shmapDeltaXY.xyzw; float4 shmapCoordCZW = shmapCoordBaseCD.xyxy + shmapDeltaZW.xyzw; float4 shmapValC; shmapValC.x = tex2D(lightShmapSamp, shmapCoordCXY.xy).x; shmapValC.y = tex2D(lightShmapSamp, shmapCoordCXY.zw).x; shmapValC.z = tex2D(lightShmapSamp, shmapCoordCZW.xy).x; shmapValC.w = tex2D(lightShmapSamp, shmapCoordCZW.zw).x; float4 shmapCoordDXY = shmapCoordBaseCD.zwzw + shmapDeltaXY.xyzw; float4 shmapCoordDZW = shmapCoordBaseCD.zwzw + shmapDeltaZW.xyzw; float4 shmapValD; shmapValD.x = tex2D(lightShmapSamp, shmapCoordDXY.xy).x; shmapValD.y = tex2D(lightShmapSamp, shmapCoordDXY.zw).x; shmapValD.z = tex2D(lightShmapSamp, shmapCoordDZW.xy).x; shmapValD.w = tex2D(lightShmapSamp, shmapCoordDZW.zw).x; float4 brightA = step(lightShmapCoord.zzzz, (shmapValA + S3D_SHMAP_ZBIAS) * lightShmapCoord.w); float4 brightB = step(lightShmapCoord.zzzz, (shmapValB + S3D_SHMAP_ZBIAS) * lightShmapCoord.w); float4 brightC = step(lightShmapCoord.zzzz, (shmapValC + S3D_SHMAP_ZBIAS) * lightShmapCoord.w); float4 brightD = step(lightShmapCoord.zzzz, (shmapValD + S3D_SHMAP_ZBIAS) * lightShmapCoord.w); float4 sumRow = brightA + brightB + brightC + shmapCoordFrac.x * (brightD - brightA); float4 colWghBase = float4(1.0 / 9.0, 1.0 / 9.0, 1.0 / 9.0, 0); float4 colWghDelta = float4(-1.0 / 9.0, 0, 0, 1.0 / 9.0); float4 colWgh = colWghBase + shmapCoordFrac.y * colWghDelta; float bright = dot(sumRow, colWgh); #else #ifdef S3D_SHMAP_FILTER4 float2 shmapCoordRaw = lightShmapCoord.xy * lightShmapSize / lightShmapCoord.w; float2 shmapCoordFull = shmapCoordRaw + float2(0.5, 0.5); float2 shmapCoordBase = floor(shmapCoordFull); float2 shmapCoordFrac = shmapCoordFull - shmapCoordBase; float4 shmapCoordBaseAB = lightShmapRcpSize.xyxy * ( shmapCoordBase.xyxy + float4(-0.5, 0, +0.5, 0)); float4 shmapDelta = lightShmapRcpSize.xyxy * float4(0, -0.5, 0, +0.5); float4 shmapCoordA = shmapCoordBaseAB.xyxy + shmapDelta.xyzw; float4 shmapCoordB = shmapCoordBaseAB.zwzw + shmapDelta.xyzw; float4 shmapVec; shmapVec.x = tex2D(lightShmapSamp, shmapCoordA.xy).x; shmapVec.y = tex2D(lightShmapSamp, shmapCoordA.zw).x; shmapVec.z = tex2D(lightShmapSamp, shmapCoordB.xy).x; shmapVec.w = tex2D(lightShmapSamp, shmapCoordB.zw).x; float4 brightVec = step(lightShmapCoord.zzzz, (shmapVec + S3D_SHMAP_ZBIAS) * lightShmapCoord.w); float2 sumRow = brightVec.xy + shmapCoordFrac.x * (brightVec.zw - brightVec.xy); float bright = sumRow.x + shmapCoordFrac.y * (sumRow.y - sumRow.x); #else float shmapVal = tex2Dproj(lightShmapSamp, lightShmapCoord.xyzw).x; float bright = step(lightShmapCoord.z, (shmapVal + S3D_SHMAP_ZBIAS) * lightShmapCoord.w); #endif #endif return bright; } /////////////////////////////////////////////////////////////////////////////// #endif