unity2021.3.31urp管线开后处理导致RT背景变黑的问题

学习过程中遇到在角色展示界面需要把背景UI放到3d角色后面,当然用世界坐标的UI可以做,但是能不能对的齐就是另一回事了,所以需要用RT把角色渲染到rawimage上,正常摄像机把background type改成纯色然后a值设置为0就是透明背景了,只有角色。
如图
1

但是摄像机加了后处理后,背景变成黑色了,
2

百度有直接改UberPost的shader的办法,就是改这个shader
3
4

但是每次改完了返回Unity加载后又会强制改回去,不知道为什么,然后又看到大佬用第二个摄像机再渲染角色进行叠加,尝试了一下可行:

Shader "UI/PostProcessingRT"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
		_MaskTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags {"Queue" = "Transparent" "RenderType"="Transparent" }
        LOD 100
        Blend One OneMinusSrcAlpha
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
			sampler2D _MaskTex;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
				fixed4 colmask = tex2D(_MaskTex, i.uv);
				col.w = colmask.w;
                return col;
            }
            ENDCG
        }
    }
}

把这个shader创建材质后挂到rawimage上,创建子摄像机,子摄像机不开后处理再输出一个RT,主摄像机RT给材质的第一个参数,子摄像机给第二个参数,这时候背景就变透明了
5
6

7

后续我又发现,把摄像机中Rendering下的“Stop NaNs”钩去掉也能解决,这个去官网查了一下是高清摄像机,官网的描述是:启用此复选框可以使该摄像机将非数字 (NaN) 值替换为黑色像素。这可以阻止某些效果崩溃,但这是一个很消耗资源的过程。仅在遇到无法解决的 NaN 问题时才启用此功能。
不是特别明白这个是否会影响后处理效果,还需多学习

2023.12.28更新:

经测试,用把摄像机中Rendering下的“Stop NaNs”钩去掉也能解决这个方法会导致部分有透明效果的shader叠加到ui上失效,还是建议用双摄像机叠加的办法,没有透明效果的shader可以用去“Stop NaNs”的方法。

附加:以下修改是让RT受遮罩影响

Shader "UI/PostProcessingRT" 
{ 
    Properties 
    { 
        _MainTex ("Texture", 2D) = "white" {} 
        _MaskTex ("Texture", 2D) = "white" {} 
        // MASK SUPPORT ADD
        _StencilComp ("Stencil Comparison", Float) = 8
        _Stencil ("Stencil ID", Float) = 0
        _StencilOp ("Stencil Operation", Float) = 0
        _StencilWriteMask ("Stencil Write Mask", Float) = 255
        _StencilReadMask ("Stencil Read Mask", Float) = 255
        _ColorMask ("Color Mask", Float) = 15
        // MASK SUPPORT END
    } 
    SubShader 
    { 
        Tags {"Queue" = "Transparent" "RenderType"="Transparent" } 
        LOD 100 
        Blend One OneMinusSrcAlpha 
        // MASK SUPPORT ADD
        Stencil 
        {
            Ref [_Stencil]
            Comp [_StencilComp]
            Pass [_StencilOp]
            ReadMask [_StencilReadMask]
            WriteMask [_StencilWriteMask]
        }
        ColorMask [_ColorMask]
        // MASK SUPPORT END
        Pass 
        { 
            CGPROGRAM 
            #pragma vertex vert 
            #pragma fragment frag 
            #include "UnityCG.cginc" 
            struct appdata 
            { 
                float4 vertex : POSITION; 
                float2 uv : TEXCOORD0; 
            }; 
            struct v2f 
            { 
                float2 uv : TEXCOORD0; 
                float4 vertex : SV_POSITION; 
            }; 
            sampler2D _MainTex; 
            float4 _MainTex_ST; 
            sampler2D _MaskTex; 
            v2f vert (appdata v) 
            { 
                v2f o; 
                o.vertex = UnityObjectToClipPos(v.vertex); 
                o.uv = TRANSFORM_TEX(v.uv, _MainTex); 
                return o; 
            } 
            fixed4 frag (v2f i) : SV_Target 
            { 
                fixed4 col = tex2D(_MainTex, i.uv); 
                fixed4 colmask = tex2D(_MaskTex, i.uv); 
                col.w = colmask.w; 
                return col; 
            } 
            ENDCG 
        } 
    } 
}
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值