public void Setup(ScriptableRenderer renderer, ref ScriptableRenderContext context, ref CullResults cullResults, ref RenderingData renderingData) { Init(); renderer.Clear(); Camera camera = renderingData.cameraData.camera; renderer.SetupPerObjectLightIndices(ref cullResults, ref renderingData.lightData); RenderTextureDescriptor baseDescriptor = ScriptableRenderer.CreateRTDesc(ref renderingData.cameraData); RenderTextureDescriptor shadowDescriptor = baseDescriptor; shadowDescriptor.dimension = TextureDimension.Tex2D; bool requiresCameraDepth = renderingData.cameraData.requiresDepthTexture; bool requiresDepthPrepass = renderingData.shadowData.requiresScreenSpaceShadowResolve || renderingData.cameraData.isSceneViewCamera || (requiresCameraDepth && !ScriptableRenderer.CanCopyDepth(ref renderingData.cameraData)); // For now VR requires a depth prepass until we figure out how to properly resolve texture2DMS in stereo requiresDepthPrepass |= renderingData.cameraData.isStereoEnabled; if (renderingData.shadowData.renderDirectionalShadows) { m_DirectionalShadowPass.Setup(DirectionalShadowmap); renderer.EnqueuePass(m_DirectionalShadowPass); } if (renderingData.shadowData.renderLocalShadows) { m_LocalShadowPass.Setup(LocalShadowmap, renderer.maxVisibleLocalLights); renderer.EnqueuePass(m_LocalShadowPass); } renderer.EnqueuePass(m_SetupForwardRenderingPass); if (requiresDepthPrepass) { m_DepthOnlyPass.Setup(baseDescriptor, DepthTexture, SampleCount.One); renderer.EnqueuePass(m_DepthOnlyPass); foreach (var pass in camera.GetComponents <IAfterDepthPrePass>()) { renderer.EnqueuePass(pass.GetPassToEnqueue(m_DepthOnlyPass.descriptor, DepthTexture)); } } if (renderingData.shadowData.renderDirectionalShadows && renderingData.shadowData.requiresScreenSpaceShadowResolve) { m_ScreenSpaceShadowResolvePass.Setup(baseDescriptor, ScreenSpaceShadowmap); renderer.EnqueuePass(m_ScreenSpaceShadowResolvePass); } bool requiresRenderToTexture = ScriptableRenderer.RequiresIntermediateColorTexture( ref renderingData.cameraData, baseDescriptor); RenderTargetHandle colorHandle = RenderTargetHandle.CameraTarget; RenderTargetHandle depthHandle = RenderTargetHandle.CameraTarget; if (requiresRenderToTexture) { colorHandle = ColorAttachment; depthHandle = DepthAttachment; var sampleCount = (SampleCount)renderingData.cameraData.msaaSamples; m_CreateLightweightRenderTexturesPass.Setup(baseDescriptor, colorHandle, depthHandle, sampleCount); renderer.EnqueuePass(m_CreateLightweightRenderTexturesPass); } if (renderingData.cameraData.isStereoEnabled) { renderer.EnqueuePass(m_BeginXrRenderingPass); } bool dynamicBatching = renderingData.supportsDynamicBatching; RendererConfiguration rendererConfiguration = ScriptableRenderer.GetRendererConfiguration(renderingData.lightData.totalAdditionalLightsCount); m_SetupLightweightConstants.Setup(renderer.maxVisibleLocalLights, renderer.perObjectLightIndices); renderer.EnqueuePass(m_SetupLightweightConstants); m_RenderOpaqueForwardPass.Setup(baseDescriptor, colorHandle, depthHandle, ScriptableRenderer.GetCameraClearFlag(camera), camera.backgroundColor, rendererConfiguration, dynamicBatching); renderer.EnqueuePass(m_RenderOpaqueForwardPass); foreach (var pass in camera.GetComponents <IAfterOpaquePass>()) { renderer.EnqueuePass(pass.GetPassToEnqueue(baseDescriptor, colorHandle, depthHandle)); } if (renderingData.cameraData.postProcessEnabled && renderingData.cameraData.postProcessLayer.HasOpaqueOnlyEffects(renderer.postProcessRenderContext)) { m_OpaquePostProcessPass.Setup(renderer.postProcessRenderContext, baseDescriptor, colorHandle); renderer.EnqueuePass(m_OpaquePostProcessPass); foreach (var pass in camera.GetComponents <IAfterOpaquePostProcess>()) { renderer.EnqueuePass(pass.GetPassToEnqueue(baseDescriptor, colorHandle, depthHandle)); } } if (camera.clearFlags == CameraClearFlags.Skybox) { m_DrawSkyboxPass.Setup(colorHandle, depthHandle); renderer.EnqueuePass(m_DrawSkyboxPass); } foreach (var pass in camera.GetComponents <IAfterSkyboxPass>()) { renderer.EnqueuePass(pass.GetPassToEnqueue(baseDescriptor, colorHandle, depthHandle)); } if (requiresCameraDepth && !requiresDepthPrepass) { m_CopyDepthPass.Setup(depthHandle, DepthTexture); renderer.EnqueuePass(m_CopyDepthPass); } if (renderingData.cameraData.requiresOpaqueTexture) { m_CopyColorPass.Setup(colorHandle, OpaqueColor); renderer.EnqueuePass(m_CopyColorPass); } m_RenderTransparentForwardPass.Setup(baseDescriptor, colorHandle, depthHandle, ClearFlag.None, camera.backgroundColor, rendererConfiguration, dynamicBatching); renderer.EnqueuePass(m_RenderTransparentForwardPass); foreach (var pass in camera.GetComponents <IAfterTransparentPass>()) { renderer.EnqueuePass(pass.GetPassToEnqueue(baseDescriptor, colorHandle, depthHandle)); } if (!renderingData.cameraData.isStereoEnabled && renderingData.cameraData.postProcessEnabled) { m_TransparentPostProcessPass.Setup(renderer.postProcessRenderContext, baseDescriptor, colorHandle, BuiltinRenderTextureType.CameraTarget); renderer.EnqueuePass(m_TransparentPostProcessPass); } else if (!renderingData.cameraData.isOffscreenRender && colorHandle != RenderTargetHandle.CameraTarget) { m_FinalBlitPass.Setup(baseDescriptor, colorHandle); renderer.EnqueuePass(m_FinalBlitPass); } foreach (var pass in camera.GetComponents <IAfterRender>()) { renderer.EnqueuePass(pass.GetPassToEnqueue()); } if (renderingData.cameraData.isStereoEnabled) { renderer.EnqueuePass(m_EndXrRenderingPass); } #if UNITY_EDITOR if (renderingData.cameraData.isSceneViewCamera) { m_SceneViewDepthCopyPass.Setup(DepthTexture); renderer.EnqueuePass(m_SceneViewDepthCopyPass); } #endif }