#if defined (SHADOWS_SOFT) float z = 1.0/128.0; float4 shadowVals; shadowVals.x = SampleCubeDistance (vec+float3( z, z, z)); shadowVals.y = SampleCubeDistance (vec+float3(-z,-z, z)); shadowVals.z = SampleCubeDistance (vec+float3(-z, z,-z)); shadowVals.w = SampleCubeDistance (vec+float3( z,-z,-z)); half4 shadows = (shadowVals < mydist.xxxx) ? _LightShadowData.rrrr : 1.0f; return dot(shadows,0.25); #else
#if defined (SHADOWS_SOFT) // , float downscale = 32.0f; // const float3 rndseed = float3(12.9898,78.233,45.5432); float3 randomvec = float3( dot(vec,rndseed) , dot(vec.yzx,rndseed) , dot(vec.zxy,rndseed) ); randomvec = frac(sin(randomvec) * 43758.5453); // float3 xvec = normalize(cross(vec,randomvec)); float3 yvec = normalize(cross(vec,xvec)); float3 vec1 = xvec / downscale; float3 vec2 = yvec / downscale; float4 shadowVals; // shadowVals.x = SampleCubeDistance (vec+vec1); shadowVals.y = SampleCubeDistance (vec+vec2); shadowVals.z = SampleCubeDistance (vec-vec1); shadowVals.w = SampleCubeDistance (vec-vec2); // half4 shadows = (shadowVals < mydist.xxxx) ? _LightShadowData.rrrr : 1.0f; return dot(shadows,0.25); #else
inline half UnitySampleShadowmap (float3 vec) { float mydist = length(vec) * _LightPositionRange.w; mydist *= 0.97; // bias const float downscale = 128.0f; const float sat_mult = 312.0f; #if defined (SHADOWS_SOFT) #define shadow_close_scalefactor (_LightShadowData.r + 0.001f) // #define xvec main_axis.zxy #define yvec main_axis.yzx #define VIRTUAL_COORD(x,y) (ceilvec + xvec*x + yvec*y) // , // ( ) half3 main_axis = abs(vec)*1666.666f; main_axis = normalize(clamp(main_axis.xyz - main_axis.yzx,0.0f,1.0f)*clamp(main_axis.xyz - main_axis.zxy,0.0f,1.0f)); // vec /= abs(dot(vec,main_axis)); // , fixed3 ceilvec = ceil(vec*downscale) / downscale; // - 4- fixed4 lerp_delta; vec = (ceilvec - vec) * downscale; lerp_delta.x = dot(vec * xvec,1.0f); lerp_delta.y = dot(vec * yvec,1.0f); lerp_delta.z = 1.0f - lerp_delta.x; lerp_delta.w = 1.0f - lerp_delta.y; // main_axis /= downscale; ceilvec -= (xvec + yvec)*0.5f; // float4 shadowVals, distance_sums, distancesides; fixed4 shadowsides, shadow_sums, distancesides_nums, distance_nums; #define DISTANCE_COMPARE_X4(sum,distance_sum,distance_num) shadowVals = mydist.xxxx - shadowVals; sum = dot(clamp(shadowVals *sat_mult,0.0f,1.0f),1.0f); distance_sum = dot(clamp(shadowVals, 0.0f,100.0f),1.0f); distance_num = dot(clamp(shadowVals *sat_mult,0.0f,1.0f),1.0f) #define DISTANCE_COMPARE_X3(sum,distance_sum,distance_num) shadowVals = mydist.xxxx - shadowVals; sum = dot(clamp(shadowVals.xyz*sat_mult,0.0f,1.0f),1.0f); distance_sum = dot(clamp(shadowVals.xyz,0.0f,100.0f),1.0f); distance_num = dot(clamp(shadowVals.xyz*sat_mult,0.0f,1.0f),1.0f) #define DISTANCE_COMPARE_X1(sum,distance_sum,distance_num) shadowVals.x = mydist - shadowVals.x; sum = clamp(shadowVals.x *sat_mult,0.0f,1.0f); distance_sum = clamp(shadowVals.x, 0.0f,100.0f); distance_num = clamp(shadowVals.x *sat_mult,0.0f,1.0f) // - // 4 shadowVals.x = SampleCubeDistance (VIRTUAL_COORD(-1.0f,-1.0f)); shadowVals.y = SampleCubeDistance (VIRTUAL_COORD(0.0f,-1.0f)); shadowVals.z = SampleCubeDistance (VIRTUAL_COORD(1.0f,-1.0f)); shadowVals.w = SampleCubeDistance (VIRTUAL_COORD(1.0f,0.0f)); DISTANCE_COMPARE_X4(shadowsides.x,distancesides.x,distancesides_nums.x); // 4 shadowVals.x = SampleCubeDistance (VIRTUAL_COORD(-1.0f,-0.0f)); shadowVals.y = SampleCubeDistance (VIRTUAL_COORD(-1.0f,1.0f)); shadowVals.z = SampleCubeDistance (VIRTUAL_COORD(0.0f,1.0f)); shadowVals.w = SampleCubeDistance (VIRTUAL_COORD(1.0f,1.0f)); DISTANCE_COMPARE_X4(shadowsides.y,distancesides.y,distancesides_nums.y); // shadowVals.x = SampleCubeDistance (VIRTUAL_COORD(0.0f,0.0f)); DISTANCE_COMPARE_X1(shadowsides.z,distancesides.z,distancesides_nums.z); // shadow_sums = dot(shadowsides.xyz,1.0f).xxxx; distance_sums = dot(distancesides.xyz,1.0f).xxxx; distance_nums = dot(distancesides_nums.xyz,1.0f).xxxx + fixed4(0.01f,0.01f,0.01f,0.01f); // // shadowVals.x = SampleCubeDistance (VIRTUAL_COORD(-2.0f,-1.0f)); shadowVals.y = SampleCubeDistance (VIRTUAL_COORD(-2.0f,0.0f)); shadowVals.z = SampleCubeDistance (VIRTUAL_COORD(-2.0f,1.0f)); DISTANCE_COMPARE_X3(shadowsides.x,distancesides.x,distancesides_nums.x); // shadowVals.x = SampleCubeDistance (VIRTUAL_COORD(-1.0f,-2.0f)); shadowVals.y = SampleCubeDistance (VIRTUAL_COORD(0.0f,-2.0f)); shadowVals.z = SampleCubeDistance (VIRTUAL_COORD(1.0f,-2.0f)); DISTANCE_COMPARE_X3(shadowsides.y,distancesides.y,distancesides_nums.y); // shadowVals.x = SampleCubeDistance (VIRTUAL_COORD(2.0f,-1.0f)); shadowVals.y = SampleCubeDistance (VIRTUAL_COORD(2.0f,0.0f)); shadowVals.z = SampleCubeDistance (VIRTUAL_COORD(2.0f,1.0f)); DISTANCE_COMPARE_X3(shadowsides.z,distancesides.z,distancesides_nums.z); // shadowVals.x = SampleCubeDistance (VIRTUAL_COORD(-1.0f,2.0f)); shadowVals.y = SampleCubeDistance (VIRTUAL_COORD(0.0f,2.0f)); shadowVals.z = SampleCubeDistance (VIRTUAL_COORD(1.0f,2.0f)); DISTANCE_COMPARE_X3(shadowsides.w,distancesides.w,distancesides_nums.w); // shadow_sums += (shadowsides.xzxz + shadowsides.yyww); distance_sums += (distancesides.xzxz + distancesides.yyww); distance_nums += distancesides_nums.xzxz + distancesides_nums.yyww; // shadowVals.x = SampleCubeDistance (VIRTUAL_COORD(-2.0f,-2.0f)); shadowVals.y = SampleCubeDistance (VIRTUAL_COORD(2.0f,-2.0f)); shadowVals.z = SampleCubeDistance (VIRTUAL_COORD(-2.0f,2.0f)); shadowVals.w = SampleCubeDistance (VIRTUAL_COORD(2.0f,2.0f)); // , shadowVals = mydist.xxxx - shadowVals; shadow_sums += clamp(shadowVals*sat_mult,0.0f,1.0f); distance_sums += clamp(shadowVals,0.0f,1.0f); distance_nums += clamp(shadowVals*sat_mult,0.0f,1.0f); // shadow_sums.x = dot(shadow_sums * lerp_delta.xzxz * lerp_delta.yyww, 1.0f) / 16.0f; distance_sums.x = dot(clamp((distance_sums/distance_nums),0.0f,1.0f) * lerp_delta.xzxz * lerp_delta.yyww, 1.0f); // fixed contrastfactor = 1.0f - clamp(distance_sums.x/shadow_close_scalefactor,0.0f,1.0f); shadow_sums.x = clamp((shadow_sums.x - 0.5f) * (1.0f + contrastfactor*4.0f)+0.5f,0.0f,1.0f); return 1.0f - shadow_sums.x; #else // 4 vec = normalize(vec) * 0.5f; // const float3 rndseed = float3(12.9898,78.233,45.5432); float3 randomvec = float3( dot(vec,rndseed) , dot(vec.yzx,rndseed) , dot(vec.zxy,rndseed) ); randomvec = frac(sin(randomvec) * 43758.5453); float3 vec1 = normalize(cross(vec,randomvec)) / downscale; float3 vec2 = normalize(cross(vec,vec1)) / downscale; float4 shadowVals; shadowVals.x = SampleCubeDistance (vec+vec1); shadowVals.y = SampleCubeDistance (vec+vec2); shadowVals.z = SampleCubeDistance (vec-vec1); shadowVals.w = SampleCubeDistance (vec-vec2); shadowVals = mydist.xxxx - shadowVals; fixed4 shadows = clamp(shadowVals*sat_mult,0.0f,1.0f); return dot(shadows,0.25); #endif }
Source: https://habr.com/ru/post/307582/