Boat Attack使用了Universal RP的许多新图形功能,可以用于探索 Universal RP 的使用方式和技巧。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

171 行
7.4 KiB

using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
using UnityEngine.Rendering.Universal.Internal;
namespace UnityEngine.Experimental.Rendering.Universal
{
internal class Renderer2D : ScriptableRenderer
{
ColorGradingLutPass m_ColorGradingLutPass;
Render2DLightingPass m_Render2DLightingPass;
PostProcessPass m_PostProcessPass;
FinalBlitPass m_FinalBlitPass;
PostProcessPass m_FinalPostProcessPass;
bool m_UseDepthStencilBuffer = true;
RenderTargetHandle m_ColorTargetHandle;
RenderTargetHandle m_AfterPostProcessColorHandle;
RenderTargetHandle m_ColorGradingLutHandle;
Renderer2DData m_Renderer2DData;
public Renderer2D(Renderer2DData data) : base(data)
{
m_ColorGradingLutPass = new ColorGradingLutPass(RenderPassEvent.BeforeRenderingOpaques, data.postProcessData);
m_Render2DLightingPass = new Render2DLightingPass(data);
m_PostProcessPass = new PostProcessPass(RenderPassEvent.BeforeRenderingPostProcessing, data.postProcessData);
m_FinalPostProcessPass = new PostProcessPass(RenderPassEvent.AfterRenderingPostProcessing, data.postProcessData);
m_FinalBlitPass = new FinalBlitPass(RenderPassEvent.AfterRendering, CoreUtils.CreateEngineMaterial(data.blitShader));
m_UseDepthStencilBuffer = data.useDepthStencilBuffer;
m_AfterPostProcessColorHandle.Init("_AfterPostProcessTexture");
m_ColorGradingLutHandle.Init("_InternalGradingLut");
m_Renderer2DData = data;
}
public Renderer2DData GetRenderer2DData()
{
return m_Renderer2DData;
}
public override void Setup(ScriptableRenderContext context, ref RenderingData renderingData)
{
ref CameraData cameraData = ref renderingData.cameraData;
ref var cameraTargetDescriptor = ref cameraData.cameraTargetDescriptor;
PixelPerfectCamera ppc = cameraData.camera.GetComponent<PixelPerfectCamera>();
Vector2Int ppcOffscreenRTSize = ppc != null ? ppc.offscreenRTSize : Vector2Int.zero;
bool ppcUsesOffscreenRT = ppcOffscreenRTSize != Vector2Int.zero;
bool postProcessEnabled = renderingData.cameraData.postProcessEnabled;
bool useOffscreenColorTexture =
ppcUsesOffscreenRT || postProcessEnabled || cameraData.isHdrEnabled || cameraData.isSceneViewCamera || !cameraData.isDefaultViewport || !m_UseDepthStencilBuffer;
// Pixel Perfect Camera may request a different RT size than camera VP size.
// In that case we need to modify cameraTargetDescriptor here so that all the passes would use the same size.
if (ppcUsesOffscreenRT)
{
cameraTargetDescriptor.width = ppcOffscreenRTSize.x;
cameraTargetDescriptor.height = ppcOffscreenRTSize.y;
}
if (useOffscreenColorTexture)
{
var filterMode = ppc != null ? ppc.finalBlitFilterMode : FilterMode.Bilinear;
m_ColorTargetHandle = CreateOffscreenColorTexture(context, ref cameraTargetDescriptor, filterMode);
}
else
m_ColorTargetHandle = RenderTargetHandle.CameraTarget;
ConfigureCameraTarget(m_ColorTargetHandle.Identifier(), BuiltinRenderTextureType.CameraTarget);
m_Render2DLightingPass.ConfigureTarget(m_ColorTargetHandle.Identifier());
EnqueuePass(m_Render2DLightingPass);
bool requireFinalBlitPass = useOffscreenColorTexture;
var finalBlitSourceHandle = m_ColorTargetHandle;
if (postProcessEnabled)
{
m_ColorGradingLutPass.Setup(m_ColorGradingLutHandle);
EnqueuePass(m_ColorGradingLutPass);
// When using Upscale Render Texture on a Pixel Perfect Camera, we want all post-processing effects done with a low-res RT,
// and only upscale the low-res RT to fullscreen when blitting it to camera target.
if (ppc != null && ppc.upscaleRT && ppc.isRunning)
{
m_PostProcessPass.Setup(
cameraTargetDescriptor,
m_ColorTargetHandle,
m_AfterPostProcessColorHandle,
RenderTargetHandle.CameraTarget,
m_ColorGradingLutHandle,
false
);
EnqueuePass(m_PostProcessPass);
requireFinalBlitPass = true;
finalBlitSourceHandle = m_AfterPostProcessColorHandle;
}
else if (renderingData.cameraData.antialiasing == AntialiasingMode.FastApproximateAntialiasing)
{
m_PostProcessPass.Setup(
cameraTargetDescriptor,
m_ColorTargetHandle,
m_AfterPostProcessColorHandle,
RenderTargetHandle.CameraTarget,
m_ColorGradingLutHandle,
true
);
EnqueuePass(m_PostProcessPass);
m_FinalPostProcessPass.SetupFinalPass(m_AfterPostProcessColorHandle);
EnqueuePass(m_FinalPostProcessPass);
requireFinalBlitPass = false;
}
else
{
m_PostProcessPass.Setup(
cameraTargetDescriptor,
m_ColorTargetHandle,
RenderTargetHandle.CameraTarget,
RenderTargetHandle.CameraTarget,
m_ColorGradingLutHandle,
false
);
EnqueuePass(m_PostProcessPass);
requireFinalBlitPass = false;
}
}
if (requireFinalBlitPass)
{
m_FinalBlitPass.Setup(cameraTargetDescriptor, finalBlitSourceHandle);
EnqueuePass(m_FinalBlitPass);
}
}
public override void SetupCullingParameters(ref ScriptableCullingParameters cullingParameters, ref CameraData cameraData)
{
cullingParameters.cullingOptions = CullingOptions.None;
cullingParameters.isOrthographic = cameraData.camera.orthographic;
cullingParameters.shadowDistance = 0.0f;
}
RenderTargetHandle CreateOffscreenColorTexture(ScriptableRenderContext context, ref RenderTextureDescriptor cameraTargetDescriptor, FilterMode filterMode)
{
RenderTargetHandle colorTextureHandle = new RenderTargetHandle();
colorTextureHandle.Init("_CameraColorTexture");
var colorDescriptor = cameraTargetDescriptor;
colorDescriptor.depthBufferBits = m_UseDepthStencilBuffer ? 32 : 0;
CommandBuffer cmd = CommandBufferPool.Get("Create Camera Textures");
cmd.GetTemporaryRT(colorTextureHandle.id, colorDescriptor, filterMode);
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
return colorTextureHandle;
}
public override void FinishRendering(CommandBuffer cmd)
{
if (m_ColorTargetHandle != RenderTargetHandle.CameraTarget)
cmd.ReleaseTemporaryRT(m_ColorTargetHandle.id);
}
}
}