private void DirLight(PipelineCamera cam, ref PipelineCommandData data) { PipelineBaseBuffer baseBuffer; if (SunLight.current == null || !SunLight.current.enabled || !SceneController.GetBaseBuffer(out baseBuffer)) { return; } cbdr.lightFlag |= 0b100; if (SunLight.current.enableShadow) { cbdr.lightFlag |= 0b010; } CommandBuffer buffer = data.buffer; int pass; if (SunLight.current.enableShadow) { RenderClusterOptions opts = new RenderClusterOptions { frustumPlanes = shadowFrustumVP, command = buffer, cullingShader = data.resources.gpuFrustumCulling, isOrtho = true }; ref ShadowmapSettings settings = ref SunLight.current.settings; buffer.SetGlobalVector(ShaderIDs._NormalBiases, settings.normalBias); //Only Depth buffer.SetGlobalVector(ShaderIDs._ShadowDisableDistance, new Vector4(settings.firstLevelDistance, settings.secondLevelDistance, settings.thirdLevelDistance, settings.farestDistance)); //Only Mask buffer.SetGlobalVector(ShaderIDs._SoftParam, settings.cascadeSoftValue / settings.resolution); SceneController.current.DrawDirectionalShadow(cam.cam, ref opts, ref SunLight.current.settings, ref SunLight.shadMap, cascadeShadowMapVP); buffer.SetGlobalMatrixArray(ShaderIDs._ShadowMapVPs, cascadeShadowMapVP); buffer.SetGlobalTexture(ShaderIDs._DirShadowMap, SunLight.shadMap.shadowmapTexture); cbdr.dirLightShadowmap = SunLight.shadMap.shadowmapTexture; pass = 0; }
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); } }