public virtual void DrawDirectionalShadow(Camera currentCam, ref RenderClusterOptions opts, ref ShadowmapSettings settings, ref ShadowMapComponent shadMap, Matrix4x4[] cascadeShadowMapVP) { }
public override void DrawDirectionalShadow(Camera currentCam, ref RenderClusterOptions opts, ref ShadowmapSettings settings, ref ShadowMapComponent shadMap, Matrix4x4[] cascadeShadowMapVP) { const int CASCADELEVELCOUNT = 4; const int CASCADECLIPSIZE = (CASCADELEVELCOUNT + 1) * sizeof(float); ComputeShader gpuFrustumShader = opts.cullingShader; StaticFit staticFit; staticFit.resolution = settings.resolution; staticFit.mainCamTrans = currentCam; staticFit.frustumCorners = shadMap.frustumCorners; float *clipDistances = stackalloc float[CASCADECLIPSIZE]; clipDistances[0] = shadMap.shadCam.nearClipPlane; clipDistances[1] = settings.firstLevelDistance; clipDistances[2] = settings.secondLevelDistance; clipDistances[3] = settings.thirdLevelDistance; clipDistances[4] = settings.farestDistance; opts.command.SetGlobalBuffer(ShaderIDs.verticesBuffer, baseBuffer.verticesBuffer); opts.command.SetGlobalBuffer(ShaderIDs.resultBuffer, baseBuffer.resultBuffer); for (int pass = 0; pass < CASCADELEVELCOUNT; ++pass) { Vector2 farClipDistance = new Vector2(clipDistances[pass], clipDistances[pass + 1]); PipelineFunctions.GetfrustumCorners(farClipDistance, ref shadMap, currentCam); // PipelineFunctions.SetShadowCameraPositionCloseFit(ref shadMap, ref settings); Matrix4x4 invpVPMatrix; PipelineFunctions.SetShadowCameraPositionStaticFit(ref staticFit, ref shadMap.shadCam, pass, cascadeShadowMapVP, out invpVPMatrix); PipelineFunctions.GetCullingPlanes(ref invpVPMatrix, opts.frustumPlanes); PipelineFunctions.SetBaseBuffer(baseBuffer, gpuFrustumShader, opts.frustumPlanes, opts.command); PipelineFunctions.RunCullDispatching(baseBuffer, gpuFrustumShader, true, opts.command); float *biasList = (float *)UnsafeUtility.AddressOf(ref settings.bias); PipelineFunctions.UpdateCascadeState(ref shadMap, opts.command, biasList[pass] / currentCam.farClipPlane, pass); opts.command.DrawProceduralIndirect(Matrix4x4.identity, shadMap.shadowDepthMaterial, 0, MeshTopology.Triangles, baseBuffer.instanceCountBuffer, 0); opts.command.DispatchCompute(gpuFrustumShader, 1, 1, 1, 1); } }