URP自定义Renderer Feature调用cameraColorTarget报错的解决方法
问题解决:URP自定义Renderer Feature中cameraColorTarget访问错误
错误原因
renderer.cameraColorTarget 仅允许在ScriptableRenderPass的执行作用域内访问(比如Execute方法中),在AddRenderPasses方法中访问时,相机目标纹理可能尚未创建或已被释放,因此触发报错。
重构方案
将设置相机颜色目标的逻辑从AddRenderPasses移到自定义ScriptableRenderPass的Execute方法中,确保在Pass的执行作用域内访问cameraColorTarget。
步骤1:修改Renderer Feature的AddRenderPasses方法
移除直接设置颜色目标的代码,改为将ScriptableRenderer实例传递给自定义Pass:
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { m_ScriptablePass.AssignRenderer(renderer); renderer.EnqueuePass(m_ScriptablePass); }
步骤2:修改自定义ScriptableRenderPass类
添加存储Renderer实例的字段,并在Execute方法中安全设置颜色目标:
public class VolumetricLightScatteringPass : ScriptableRenderPass { private ScriptableRenderer _assignedRenderer; // 用于接收Renderer实例 public void AssignRenderer(ScriptableRenderer renderer) { _assignedRenderer = renderer; } public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { // 处于Pass执行作用域内,可安全访问cameraColorTarget SetCameraColorTarget(_assignedRenderer.cameraColorTarget); // 此处添加你的体积光散射渲染逻辑 } }
替代方案:传递RenderTargetHandle
如果不想持有Renderer实例,也可以在AddRenderPasses中传递颜色目标的句柄,在Pass内转换使用:
// Renderer Feature的AddRenderPasses public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { m_ScriptablePass.SetColorTarget(renderer.cameraColorTargetHandle); renderer.EnqueuePass(m_ScriptablePass); } // 自定义Pass类 public class VolumetricLightScatteringPass : ScriptableRenderPass { private RenderTargetHandle _colorTargetHandle; public void SetColorTarget(RenderTargetHandle targetHandle) { _colorTargetHandle = targetHandle; } public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { RenderTargetIdentifier colorTarget = _colorTargetHandle.Identifier(); SetCameraColorTarget(colorTarget); // 渲染逻辑... } }
内容的提问来源于stack exchange,提问作者niklaswort
相关产品推荐
相关产品推荐

