/////////////////////////////////////////////////////////////////////////////// // // ## ###### // ###### ### // ## ############### 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_LIGHT_SHMAP float shmapVal = s3d_shmapFilter( lightShmapSamp, lightShmapCoord, lightShmapSize, lightShmapRcpSize); @ifdef S3D_SHMAP_FILTER16 vec2 shmapCoordRaw = lightShmapCoord.xy * lightShmapSize.xy / lightShmapCoord.w; vec2 shmapCoordFull = shmapCoordRaw + vec2(0.5, 0.5); vec2 shmapCoordBase = floor(shmapCoordFull); vec2 shmapCoordFrac = shmapCoordFull - shmapCoordBase; vec4 shmapCoordBaseAB = lightShmapRcpSize.xyxy * ( shmapCoordBase.xyxy + vec4(-1.5, 0, -0.5, 0)); vec4 shmapCoordBaseCD = lightShmapRcpSize.xyxy * ( shmapCoordBase.xyxy + vec4(+0.5, 0, +1.5, 0)); vec4 shmapDeltaXY = lightShmapRcpSize.xyxy * vec4(0, -1.5, 0, -0.5); vec4 shmapDeltaZW = lightShmapRcpSize.xyxy * vec4(0, +0.5, 0, +1.5); vec4 shmapCoordAXY = shmapCoordBaseAB.xyxy + shmapDeltaXY.xyzw; vec4 shmapCoordAZW = shmapCoordBaseAB.xyxy + shmapDeltaZW.xyzw; vec4 shmapValA; shmapValA.x = texture2D(lightShmapSamp, shmapCoordAXY.xy).x; shmapValA.y = texture2D(lightShmapSamp, shmapCoordAXY.zw).x; shmapValA.z = texture2D(lightShmapSamp, shmapCoordAZW.xy).x; shmapValA.w = texture2D(lightShmapSamp, shmapCoordAZW.zw).x; vec4 shmapCoordBXY = shmapCoordBaseAB.zwzw + shmapDeltaXY.xyzw; vec4 shmapCoordBZW = shmapCoordBaseAB.zwzw + shmapDeltaZW.xyzw; vec4 shmapValB; shmapValB.x = texture2D(lightShmapSamp, shmapCoordBXY.xy).x; shmapValB.y = texture2D(lightShmapSamp, shmapCoordBXY.zw).x; shmapValB.z = texture2D(lightShmapSamp, shmapCoordBZW.xy).x; shmapValB.w = texture2D(lightShmapSamp, shmapCoordBZW.zw).x; vec4 shmapCoordCXY = shmapCoordBaseCD.xyxy + shmapDeltaXY.xyzw; vec4 shmapCoordCZW = shmapCoordBaseCD.xyxy + shmapDeltaZW.xyzw; vec4 shmapValC; shmapValC.x = texture2D(lightShmapSamp, shmapCoordCXY.xy).x; shmapValC.y = texture2D(lightShmapSamp, shmapCoordCXY.zw).x; shmapValC.z = texture2D(lightShmapSamp, shmapCoordCZW.xy).x; shmapValC.w = texture2D(lightShmapSamp, shmapCoordCZW.zw).x; vec4 shmapCoordDXY = shmapCoordBaseCD.zwzw + shmapDeltaXY.xyzw; vec4 shmapCoordDZW = shmapCoordBaseCD.zwzw + shmapDeltaZW.xyzw; vec4 shmapValD; shmapValD.x = texture2D(lightShmapSamp, shmapCoordDXY.xy).x; shmapValD.y = texture2D(lightShmapSamp, shmapCoordDXY.zw).x; shmapValD.z = texture2D(lightShmapSamp, shmapCoordDZW.xy).x; shmapValD.w = texture2D(lightShmapSamp, shmapCoordDZW.zw).x; vec4 brightA = step(lightShmapCoord.zzzz, shmapValA * lightShmapCoord.w); vec4 brightB = step(lightShmapCoord.zzzz, shmapValB * lightShmapCoord.w); vec4 brightC = step(lightShmapCoord.zzzz, shmapValC * lightShmapCoord.w); vec4 brightD = step(lightShmapCoord.zzzz, shmapValD * lightShmapCoord.w); vec4 sumRow = brightA + brightB + brightC + shmapCoordFrac.x * (brightD - brightA); vec4 colWgh = vec4(1, 1, 1, 0) + shmapCoordFrac.y * vec4(-1, 0, 0, 1); float sum = dot(sumRow, colWgh); float shmapVal = sum * (1.0 / 9.0); @else @ifdef S3D_SHMAP_FILTER4 vec2 shmapCoordRaw = lightShmapCoord.xy * lightShmapSize.xy / lightShmapCoord.w; vec2 shmapCoordFull = shmapCoordRaw + vec2(0.5, 0.5); vec2 shmapCoordBase = floor(shmapCoordFull); vec2 shmapCoordFrac = shmapCoordFull - shmapCoordBase; vec4 shmapCoordBaseAB = lightShmapRcpSize.xyxy * ( shmapCoordBase.xyxy + vec4(-0.5, 0, +0.5, 0)); vec4 shmapDelta = lightShmapRcpSize.xyxy * vec4(0, -0.5, 0, +0.5); vec4 shmapCoordA = shmapCoordBaseAB.xyxy + shmapDelta.xyzw; vec4 shmapCoordB = shmapCoordBaseAB.zwzw + shmapDelta.xyzw; vec4 shmapVec; shmapVec.x = texture2D(lightShmapSamp, shmapCoordA.xy).x; shmapVec.y = texture2D(lightShmapSamp, shmapCoordA.zw).x; shmapVec.z = texture2D(lightShmapSamp, shmapCoordB.xy).x; shmapVec.w = texture2D(lightShmapSamp, shmapCoordB.zw).x; vec4 brightVec = step(lightShmapCoord.zzzz, shmapVec * lightShmapCoord.w); vec2 sumRow = brightVec.xy + shmapCoordFrac.x * (brightVec.zw - brightVec.xy); float shmapVal = sumRow.x + shmapCoordFrac.y * (sumRow.y - sumRow.x); @else float shmapVal = texture2DProj(lightShmapSamp, lightShmapCoord.xyw).x; float shmapVal = step(lightShmapCoord.z, shmapVal * lightShmapCoord.w); @endif @endif @endif } /////////////////////////////////////////////////////////////////////////////// #endif