学习过程中遇到在角色展示界面需要把背景UI放到3d角色后面,当然用世界坐标的UI可以做,但是能不能对的齐就是另一回事了,所以需要用RT把角色渲染到rawimage上,正常摄像机把background type改成纯色然后a值设置为0就是透明背景了,只有角色。
如图
但是摄像机加了后处理后,背景变成黑色了,
百度有直接改UberPost的shader的办法,就是改这个shader
但是每次改完了返回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给材质的第一个参数,子摄像机给第二个参数,这时候背景就变透明了
后续我又发现,把摄像机中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
}
}
}