You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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逻辑参与。
  • 修复步骤:
    1. 选中后处理相机使用的Renderer资产,找到添加的Render Feature配置项,将*Downsampling(降采样)*选项设为None,禁止对RT做分辨率缩减
    2. 将Render Feature使用的临时RT格式(Render Texture Format)设置为与相机输出一致的格式,2D项目优先选择R8G8B8A8_UNorm,如果项目开启了HDR则选择对应HDR格式,不要选择压缩格式、16位低精度格式
    3. 检查堆叠的Base Camera与Overlay Camera参数,保证两者分辨率、视口设置完全一致,不要给Overlay Camera设置单独的视口缩放、低分辨率输出
  • 优化建议: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颜色(白色);二是相机视口未完全覆盖屏幕,留出了缝隙。
  • 修复:
    1. 检查Base Camera与Overlay Camera的视口参数,保证视口起始坐标为(0,0)、宽高为(1,1),完全覆盖屏幕
    2. 将Render Feature使用的临时RT的Clear颜色设置为透明黑(RGBA(0,0,0,0)),避免边缘透出Clear颜色
    3. 若仍存在白边,可在Shader采样时对UV做半个像素的偏移修正,对齐_CameraOpaqueTexture的纹素坐标。

内容的提问来源于stack exchange,提问作者Hubcat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 16:01:05