您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
233 行
11 KiB
233 行
11 KiB
using System;
|
|
using UnityEngine.Rendering;
|
|
|
|
namespace UnityEngine.Experimental.Rendering.LightweightPipeline
|
|
{
|
|
public class MyLWRenderer : MonoBehaviour, IRendererSetup
|
|
{
|
|
private DepthOnlyPass m_DepthOnlyPass;
|
|
private DirectionalShadowsPass m_DirectionalShadowPass;
|
|
private LocalShadowsPass m_LocalShadowPass;
|
|
private SetupForwardRenderingPass m_SetupForwardRenderingPass;
|
|
private ScreenSpaceShadowResolvePass m_ScreenSpaceShadowResovePass;
|
|
private CreateLightweightRenderTexturesPass m_CreateLightweightRenderTexturesPass;
|
|
private BeginXRRenderingPass m_BeginXrRenderingPass;
|
|
private SetupLightweightConstanstPass m_SetupLightweightConstants;
|
|
private RenderOpaqueForwardPass m_RenderOpaqueForwardPass;
|
|
private OpaquePostProcessPass m_OpaquePostProcessPass;
|
|
private DrawSkyboxPass m_DrawSkyboxPass;
|
|
private CopyDepthPass m_CopyDepthPass;
|
|
private CopyColorPass m_CopyColorPass;
|
|
private RenderTransparentForwardPass m_RenderTransparentForwardPass;
|
|
private TransparentPostProcessPass m_TransparentPostProcessPass;
|
|
private FinalBlitPass m_FinalBlitPass;
|
|
private EndXRRenderingPass m_EndXrRenderingPass;
|
|
|
|
private WaterFXPass m_WaterFXPass;
|
|
|
|
#if UNITY_EDITOR
|
|
private SceneViewDepthCopyPass m_SceneViewDepthCopyPass;
|
|
#endif
|
|
|
|
|
|
private RenderTargetHandle Color;
|
|
private RenderTargetHandle DepthAttachment;
|
|
private RenderTargetHandle DepthTexture;
|
|
private RenderTargetHandle OpaqueColor;
|
|
private RenderTargetHandle DirectionalShadowmap;
|
|
private RenderTargetHandle LocalShadowmap;
|
|
private RenderTargetHandle ScreenSpaceShadowmap;
|
|
|
|
[NonSerialized]
|
|
private bool m_Initialized = false;
|
|
|
|
public bool m_addToSceneCamera = true;
|
|
|
|
|
|
private void Init(LightweightForwardRenderer renderer)
|
|
{
|
|
if (m_Initialized)
|
|
return;
|
|
|
|
// Add this custom renderer component to the scene camera(I'm not looking at removing so could cause issues)
|
|
if(m_addToSceneCamera)
|
|
{
|
|
Object[] cameras = Resources.FindObjectsOfTypeAll(typeof(Camera));
|
|
for (var i = 0; i < cameras.Length; i++)
|
|
{
|
|
Camera cam = cameras[i] as Camera;
|
|
if(cam.cameraType == CameraType.SceneView)
|
|
{
|
|
if(cam.gameObject.GetComponent(this.GetType()) == null)
|
|
{
|
|
cam.gameObject.AddComponent(this.GetType());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
m_DepthOnlyPass = new DepthOnlyPass();
|
|
m_DirectionalShadowPass = new DirectionalShadowsPass();
|
|
m_LocalShadowPass = new LocalShadowsPass();
|
|
m_SetupForwardRenderingPass = new SetupForwardRenderingPass();
|
|
m_ScreenSpaceShadowResovePass = new ScreenSpaceShadowResolvePass(renderer.GetMaterial(MaterialHandles.ScrenSpaceShadow));
|
|
m_CreateLightweightRenderTexturesPass = new CreateLightweightRenderTexturesPass();
|
|
m_BeginXrRenderingPass = new BeginXRRenderingPass();
|
|
m_SetupLightweightConstants = new SetupLightweightConstanstPass();
|
|
m_RenderOpaqueForwardPass = new RenderOpaqueForwardPass(renderer.GetMaterial(MaterialHandles.Error));
|
|
m_OpaquePostProcessPass = new OpaquePostProcessPass();
|
|
m_DrawSkyboxPass = new DrawSkyboxPass();
|
|
m_CopyDepthPass = new CopyDepthPass(renderer.GetMaterial(MaterialHandles.DepthCopy));
|
|
m_CopyColorPass = new CopyColorPass(renderer.GetMaterial(MaterialHandles.Sampling));
|
|
m_RenderTransparentForwardPass = new RenderTransparentForwardPass(renderer.GetMaterial(MaterialHandles.Error));
|
|
m_TransparentPostProcessPass = new TransparentPostProcessPass();
|
|
m_FinalBlitPass = new FinalBlitPass(renderer.GetMaterial(MaterialHandles.Blit));
|
|
m_EndXrRenderingPass = new EndXRRenderingPass();
|
|
|
|
m_WaterFXPass = new WaterFXPass();
|
|
|
|
#if UNITY_EDITOR
|
|
m_SceneViewDepthCopyPass = new SceneViewDepthCopyPass(renderer.GetMaterial(MaterialHandles.DepthCopy));
|
|
#endif
|
|
|
|
// RenderTexture format depends on camera and pipeline (HDR, non HDR, etc)
|
|
// Samples (MSAA) depend on camera and pipeline
|
|
Color.Init("_CameraColorTexture");
|
|
DepthAttachment.Init("_CameraDepthAttachment");
|
|
DepthTexture.Init("_CameraDepthTexture");
|
|
OpaqueColor.Init("_CameraOpaqueTexture");
|
|
DirectionalShadowmap.Init("_DirectionalShadowmapTexture");
|
|
LocalShadowmap.Init("_LocalShadowmapTexture");
|
|
ScreenSpaceShadowmap.Init("_ScreenSpaceShadowMapTexture");
|
|
|
|
m_Initialized = true;
|
|
}
|
|
|
|
public void Setup(LightweightForwardRenderer renderer, ref ScriptableRenderContext context,
|
|
ref CullResults cullResults, ref RenderingData renderingData)
|
|
{
|
|
Init(renderer);
|
|
|
|
renderer.Clear();
|
|
|
|
renderer.SetupPerObjectLightIndices(ref cullResults, ref renderingData.lightData);
|
|
RenderTextureDescriptor baseDescriptor = LightweightForwardRenderer.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 &&
|
|
!LightweightForwardRenderer.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);
|
|
}
|
|
|
|
if (renderingData.shadowData.renderDirectionalShadows &&
|
|
renderingData.shadowData.requiresScreenSpaceShadowResolve)
|
|
{
|
|
m_ScreenSpaceShadowResovePass.Setup(baseDescriptor, ScreenSpaceShadowmap);
|
|
renderer.EnqueuePass(m_ScreenSpaceShadowResovePass);
|
|
}
|
|
|
|
bool requiresDepthAttachment = requiresCameraDepth && !requiresDepthPrepass;
|
|
bool requiresColorAttachment =
|
|
LightweightForwardRenderer.RequiresIntermediateColorTexture(
|
|
ref renderingData.cameraData,
|
|
baseDescriptor,
|
|
requiresDepthAttachment);
|
|
RenderTargetHandle colorHandle = (requiresColorAttachment) ? Color : RenderTargetHandle.CameraTarget;
|
|
RenderTargetHandle depthHandle = (requiresDepthAttachment) ? DepthAttachment : RenderTargetHandle.CameraTarget;
|
|
|
|
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);
|
|
|
|
Camera camera = renderingData.cameraData.camera;
|
|
bool dynamicBatching = renderingData.supportsDynamicBatching;
|
|
RendererConfiguration rendererConfiguration = LightweightForwardRenderer.GetRendererConfiguration(renderingData.lightData.totalAdditionalLightsCount);
|
|
|
|
m_SetupLightweightConstants.Setup(renderer.maxVisibleLocalLights, renderer.perObjectLightIndices);
|
|
renderer.EnqueuePass(m_SetupLightweightConstants);
|
|
|
|
m_RenderOpaqueForwardPass.Setup(baseDescriptor, colorHandle, depthHandle, LightweightForwardRenderer.GetCameraClearFlag(camera), camera.backgroundColor, rendererConfiguration,dynamicBatching);
|
|
renderer.EnqueuePass(m_RenderOpaqueForwardPass);
|
|
|
|
if (renderingData.cameraData.postProcessEnabled &&
|
|
renderingData.cameraData.postProcessLayer.HasOpaqueOnlyEffects(renderer.postProcessRenderContext))
|
|
{
|
|
m_OpaquePostProcessPass.Setup(renderer.postProcessRenderContext, baseDescriptor, colorHandle);
|
|
renderer.EnqueuePass(m_OpaquePostProcessPass);
|
|
}
|
|
|
|
if (camera.clearFlags == CameraClearFlags.Skybox)
|
|
renderer.EnqueuePass(m_DrawSkyboxPass);
|
|
|
|
if (depthHandle != RenderTargetHandle.CameraTarget)
|
|
{
|
|
m_CopyDepthPass.Setup(depthHandle, DepthTexture);
|
|
renderer.EnqueuePass(m_CopyDepthPass);
|
|
}
|
|
|
|
if (renderingData.cameraData.requiresOpaqueTexture)
|
|
{
|
|
m_CopyColorPass.Setup(colorHandle, OpaqueColor);
|
|
renderer.EnqueuePass(m_CopyColorPass);
|
|
}
|
|
|
|
renderer.EnqueuePass(m_WaterFXPass);
|
|
|
|
m_RenderTransparentForwardPass.Setup(baseDescriptor, colorHandle, depthHandle, ClearFlag.None, camera.backgroundColor, rendererConfiguration, dynamicBatching);
|
|
renderer.EnqueuePass(m_RenderTransparentForwardPass);
|
|
|
|
if (renderingData.cameraData.postProcessEnabled)
|
|
{
|
|
m_TransparentPostProcessPass.Setup(renderer.postProcessRenderContext, baseDescriptor, colorHandle);
|
|
renderer.EnqueuePass(m_TransparentPostProcessPass);
|
|
}
|
|
else if (!renderingData.cameraData.isOffscreenRender && colorHandle != RenderTargetHandle.CameraTarget)
|
|
{
|
|
m_FinalBlitPass.Setup(baseDescriptor, colorHandle);
|
|
renderer.EnqueuePass(m_FinalBlitPass);
|
|
}
|
|
|
|
if (renderingData.cameraData.isStereoEnabled)
|
|
{
|
|
renderer.EnqueuePass(m_EndXrRenderingPass);
|
|
}
|
|
|
|
#if UNITY_EDITOR
|
|
if (renderingData.cameraData.isSceneViewCamera)
|
|
{
|
|
m_SceneViewDepthCopyPass.Setup(DepthTexture);
|
|
renderer.EnqueuePass(m_SceneViewDepthCopyPass);
|
|
}
|
|
#endif
|
|
}
|
|
}
|
|
}
|