private void DirLight(PipelineCamera cam, ref PipelineCommandData data) { if (SunLight.current == null || !SunLight.current.enabled) { return; } cbdr.lightFlag |= 0b100; if (SunLight.current.enableShadow) { cbdr.lightFlag |= 0b010; } CommandBuffer buffer = data.buffer; if (SunLight.current.enableShadow) { RenderClusterOptions opts = new RenderClusterOptions { frustumPlanes = shadowFrustumVP, command = buffer, cullingShader = data.resources.shaders.gpuFrustumCulling, }; buffer.SetGlobalVector(ShaderIDs._ShadowDisableDistance, new Vector4(SunLight.current.firstLevelDistance, SunLight.current.secondLevelDistance, SunLight.current.thirdLevelDistance, SunLight.current.farestDistance));//Only Mask buffer.SetGlobalVector(ShaderIDs._SoftParam, SunLight.current.cascadeSoftValue / SunLight.current.resolution); float *cascadeShadowmap = stackalloc float[4]; cascadeShadowmap[0] = 0; float maxCascadeLevel = SunLight.CASCADELEVELCOUNT - 1; for (int i = 1; i < 4; ++i) { cascadeShadowmap[i] = min(maxCascadeLevel, i); } buffer.SetGlobalVector(ShaderIDs._CascadeShadowWeight, *(float4 *)cascadeShadowmap); sunCullResultHandle.Complete(); SceneController.DrawDirectionalShadow(cam, ref data, ref opts, clipDistances, sunShadowCams, cascadeShadowMapVP, proper.overrideOpaqueMaterial); buffer.SetGlobalMatrixArray(ShaderIDs._ShadowMapVPs, cascadeShadowMapVP); buffer.SetGlobalTexture(ShaderIDs._DirShadowMap, SunLight.current.shadowmapTexture); cbdr.dirLightShadowmap = SunLight.current.shadowmapTexture; staticFit.frustumCorners.Dispose(); } buffer.SetGlobalVector(ShaderIDs._DirLightFinalColor, SunLight.current.light.color * SunLight.current.light.intensity); buffer.SetGlobalVector(ShaderIDs._DirLightPos, -SunLight.current.transform.forward); }
private void DirLight(PipelineCamera cam, ref PipelineCommandData data) { if (SunLight.current == null || !SunLight.current.enabled) { 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 }; buffer.SetGlobalVector(ShaderIDs._NormalBiases, SunLight.current.normalBias); //Only Depth buffer.SetGlobalVector(ShaderIDs._ShadowDisableDistance, new Vector4(SunLight.current.firstLevelDistance, SunLight.current.secondLevelDistance, SunLight.current.thirdLevelDistance, SunLight.current.farestDistance));//Only Mask buffer.SetGlobalVector(ShaderIDs._SoftParam, SunLight.current.cascadeSoftValue / SunLight.current.resolution); SceneController.DrawDirectionalShadow(cam.cam, ref data, ref opts, SunLight.current, cascadeShadowMapVP); buffer.SetGlobalMatrixArray(ShaderIDs._ShadowMapVPs, cascadeShadowMapVP); buffer.SetGlobalTexture(ShaderIDs._DirShadowMap, SunLight.current.shadowmapTexture); cbdr.dirLightShadowmap = SunLight.current.shadowmapTexture; pass = 0; } else { pass = 1; } buffer.SetGlobalVector(ShaderIDs._DirLightFinalColor, SunLight.current.light.color * SunLight.current.light.intensity); buffer.SetGlobalVector(ShaderIDs._DirLightPos, -(Vector3)SunLight.current.shadCam.forward); buffer.SetRenderTarget(cam.targets.renderTargetIdentifier, cam.targets.depthIdentifier); buffer.DrawMesh(GraphicsUtility.mesh, Matrix4x4.identity, shadMaskMaterial, 0, pass); }
private void DirLight(PipelineCamera cam, ref PipelineCommandData data) { if (SunLight.current == null || !SunLight.current.enabled) { 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.shaders.gpuFrustumCulling, }; buffer.SetGlobalVector(ShaderIDs._NormalBiases, SunLight.current.normalBias); //Only Depth buffer.SetGlobalVector(ShaderIDs._ShadowDisableDistance, new Vector4(SunLight.current.firstLevelDistance, SunLight.current.secondLevelDistance, SunLight.current.thirdLevelDistance, SunLight.current.farestDistance));//Only Mask buffer.SetGlobalVector(ShaderIDs._SoftParam, SunLight.current.cascadeSoftValue / SunLight.current.resolution); csmHandle.Complete(); SceneController.DrawDirectionalShadow(cam, ref staticFit, ref data, ref opts, clipDistances, cascadeWorldToCamera, cascadeProjection); buffer.SetGlobalMatrixArray(ShaderIDs._ShadowMapVPs, cascadeShadowMapVP); buffer.SetGlobalTexture(ShaderIDs._DirShadowMap, SunLight.current.shadowmapTexture); cbdr.dirLightShadowmap = SunLight.current.shadowmapTexture; staticFit.frustumCorners.Dispose(); pass = 0; } else { pass = 1; } buffer.SetGlobalVector(ShaderIDs._DirLightFinalColor, SunLight.current.light.color * SunLight.current.light.intensity); buffer.SetGlobalVector(ShaderIDs._DirLightPos, -(Vector3)SunLight.current.shadCam.forward); }