private void ExecutePlanarReflections(ScriptableRenderContext context, Camera camera) { // we dont want to render planar reflections in reflections or previews if (camera.cameraType == CameraType.Reflection || camera.cameraType == CameraType.Preview) { return; } UpdateReflectionCamera(camera); // create reflected camera PlanarReflectionTexture(camera); // create and assign RenderTexture var data = new PlanarReflectionSettingData(); // save quality settings and lower them for the planar reflections data.Set(); // set quality settings BeginPlanarReflections?.Invoke(context, _reflectionCamera); // callback Action for PlanarReflection UniversalRenderPipeline.RenderSingleCamera(context, _reflectionCamera); // render planar reflections data.Restore(); // restore the quality settings Shader.SetGlobalTexture(_planarReflectionTextureId, _reflectionTexture); // Assign texture to water shader }
/// <summary> /// Set RenderBuffer for camera; /// </summary> private void RefreshRenderBufferForSingleCamera(ScriptableRenderContext context, ref RenderingData renderingData, ref CameraData cameraData, out bool requiresDepthPrepass, out bool createDepthTexture) { Camera camera = renderingData.cameraData.camera; RenderTextureDescriptor cameraTargetDescriptor = renderingData.cameraData.cameraTargetDescriptor; bool applyPostProcessing = cameraData.postProcessEnabled; bool isSceneViewCamera = cameraData.isSceneViewCamera; bool isPreviewCamera = cameraData.isPreviewCamera; bool requiresDepthTexture = cameraData.requiresDepthTexture; bool isStereoEnabled = cameraData.isStereoEnabled; // Depth prepass is generated in the following cases: // - If game or offscreen camera requires it we check if we can copy the depth from the rendering opaques pass and use that instead. // - Scene or preview cameras always require a depth texture. We do a depth pre-pass to simplify it and it shouldn't matter much for editor. requiresDepthPrepass = requiresDepthTexture && !CanCopyDepth(ref renderingData.cameraData); requiresDepthPrepass |= isSceneViewCamera; requiresDepthPrepass |= isPreviewCamera; // The copying of depth should normally happen after rendering opaques. // But if we only require it for post processing or the scene camera then we do it after rendering transparent objects m_CopyDepthPass.renderPassEvent = (!requiresDepthTexture && (applyPostProcessing || isSceneViewCamera)) ? RenderPassEvent.AfterRenderingTransparents : RenderPassEvent.AfterRenderingOpaques; // TODO: CopyDepth pass is disabled in XR due to required work to handle camera matrices in URP. // IF this condition is removed make sure the CopyDepthPass.cs is working properly on all XR modes. This requires PureXR SDK integration. if (isStereoEnabled && requiresDepthTexture) { requiresDepthPrepass = true; } bool isRunningHololens = false; #if ENABLE_VR && ENABLE_VR_MODULE isRunningHololens = UniversalRenderPipeline.IsRunningHololens(camera); #endif bool createColorTexture = RequiresIntermediateColorTexture(ref cameraData); createColorTexture |= (rendererFeatures.Count != 0 && !isRunningHololens); createColorTexture &= !isPreviewCamera; // If camera requires depth and there's no depth pre-pass we create a depth texture that can be read later by effect requiring it. createDepthTexture = cameraData.requiresDepthTexture && !requiresDepthPrepass; createDepthTexture |= (cameraData.renderType == CameraRenderType.Base && !cameraData.resolveFinalTarget); #if UNITY_ANDROID || UNITY_WEBGL if (SystemInfo.graphicsDeviceType != GraphicsDeviceType.Vulkan) { // GLES can not use render texture's depth buffer with the color buffer of the backbuffer // in such case we create a color texture for it too. createColorTexture |= createDepthTexture; } #endif // Configure all settings require to start a new camera stack (base camera only) if (cameraData.renderType == CameraRenderType.Base) { m_ActiveCameraColorAttachment = (createColorTexture) ? m_CameraColorAttachment : RenderTargetHandle.CameraTarget; m_ActiveCameraDepthAttachment = (createDepthTexture) ? m_CameraDepthAttachment : RenderTargetHandle.CameraTarget; bool intermediateRenderTexture = createColorTexture || createDepthTexture; // Doesn't create texture for Overlay cameras as they are already overlaying on top of created textures. bool createTextures = intermediateRenderTexture; if (createTextures) { CreateCameraRenderTarget(context, ref renderingData.cameraData); } // if rendering to intermediate render texture we don't have to create msaa backbuffer int backbufferMsaaSamples = (intermediateRenderTexture) ? 1 : cameraTargetDescriptor.msaaSamples; if (Camera.main == camera && camera.cameraType == CameraType.Game && cameraData.targetTexture == null) { SetupBackbufferFormat(backbufferMsaaSamples, isStereoEnabled); } } else { if (m_SplitUICameraAndSceneCameraRenderer) { RefreshCameraColorAttachment(context, ref renderingData.cameraData); } else { m_ActiveCameraColorAttachment = m_CameraColorAttachment; m_ActiveCameraDepthAttachment = m_CameraDepthAttachment; } } ConfigureCameraTarget(m_ActiveCameraColorAttachment.Identifier(), m_ActiveCameraDepthAttachment.Identifier()); }