Unity 2D URP相机堆叠实现后处理时画面渲染画质下降问题
2D URP 自定义后处理适配异常解决方案
问题现象
- 实现方案:采用相机堆叠搭配Render Feature的方案实现2D URP下的后处理效果,Base Camera负责渲染大部分场景与2D灯光,Overlay Camera负责渲染后处理效果
- 核心异常:开启负责后处理的Overlay Camera后,画面渲染质量大幅下降,实际运行时画质降低的感知非常强烈;测试发现即便将Shader从Render Feature上解绑,只要Render Feature保持启用,画质下降问题就会存在,禁用Render Feature后画质即可恢复正常;使用独立相机渲染的UI不受画质下降问题与后处理Shader的影响
- 当前测试用后处理Shader未写入实际效果逻辑,仅采样
_CameraOpaqueTexture后原样输出(注释了颜色反色的测试逻辑),代码如下:
Shader "PixelationShader" { SubShader { Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline"} LOD 100 ZWrite Off Cull Off Pass { Name "PixelationShader" HLSLPROGRAM #pragma vertex vert #pragma fragment frag #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" struct Attributes { float4 positionHCS : POSITION; float2 uv : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct Varyings { float4 positionCS : SV_POSITION; float2 uv : TEXCOORD0; UNITY_VERTEX_OUTPUT_STEREO }; Varyings vert(Attributes input) { Varyings output; // Note: The pass is setup with a mesh already in clip // space, that's why, it's enough to just output vertex // positions output.positionCS = float4(input.positionHCS.xyz, 1.0); #if UNITY_UV_STARTS_AT_TOP output.positionCS.y *= -1; #endif output.uv = input.uv; return output; } TEXTURE2D_X(_CameraOpaqueTexture); SAMPLER(sampler_CameraOpaqueTexture); half4 frag(Varyings input) : SV_Target { UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input); float4 color = SAMPLE_TEXTURE2D_X(_CameraOpaqueTexture, sampler_CameraOpaqueTexture, input.uv); //color.rgb = 1 - color.rgb; return color; } ENDHLSL } } }
- 附带问题1:游戏运行时画面中意外出现编辑器的灯光图标
- 附带问题2:屏幕边缘存在白边
原因排查与解决方法
核心画质下降问题
画质下降和编写的Shader无关,是Render Feature的RT配置错误导致的:
- 只要Render Feature启用,哪怕不绑定自定义材质,也会执行一次源纹理到临时渲染纹理的Blit拷贝操作。如果临时RT的分辨率、精度配置低于相机输出规格,就会直接造成画质损失,不需要Shader逻辑参与。
- 修复步骤:
- 选中后处理相机使用的Renderer资产,找到添加的Render Feature配置项,将*Downsampling(降采样)*选项设为
None,禁止对RT做分辨率缩减 - 将Render Feature使用的临时RT格式(Render Texture Format)设置为与相机输出一致的格式,2D项目优先选择
R8G8B8A8_UNorm,如果项目开启了HDR则选择对应HDR格式,不要选择压缩格式、16位低精度格式 - 检查堆叠的Base Camera与Overlay Camera参数,保证两者分辨率、视口设置完全一致,不要给Overlay Camera设置单独的视口缩放、低分辨率输出
- 选中后处理相机使用的Renderer资产,找到添加的Render Feature配置项,将*Downsampling(降采样)*选项设为
- 优化建议:2D URP下不需要额外创建Overlay Camera挂载后处理,直接将Render Feature添加到Base Camera使用的2D Renderer资产的Feature列表即可,减少一次相机堆叠带来的额外RT拷贝开销,也能避免多相机配置不一致引发的渲染异常。
附带问题1:运行时显示编辑器灯光图标
- 原因:后处理Overlay Camera错误开启了Gizmo渲染开关,编辑器运行时会将场景的灯光Gizmo图标渲染到输出画面中(打包后不会出现该问题)
- 修复:选中后处理Overlay Camera,在相机组件Inspector面板底部取消勾选Render Gizmos选项;同时检查相机的Culling Mask,剔除
Editor Only、Gizmo这类非游戏渲染层级。
附带问题2:屏幕边缘白边
- 原因:该问题由两种常见错误引发:一是Blit采样时UV存在半个像素的偏移,边缘采样到了RT的默认Clear颜色(白色);二是相机视口未完全覆盖屏幕,留出了缝隙。
- 修复:
- 检查Base Camera与Overlay Camera的视口参数,保证视口起始坐标为(0,0)、宽高为(1,1),完全覆盖屏幕
- 将Render Feature使用的临时RT的Clear颜色设置为透明黑(RGBA(0,0,0,0)),避免边缘透出Clear颜色
- 若仍存在白边,可在Shader采样时对UV做半个像素的偏移修正,对齐
_CameraOpaqueTexture的纹素坐标。
内容的提问来源于stack exchange,提问作者Hubcat
相关产品推荐
相关产品推荐

