我们在做角色渲染时,通常会遇到一种情况,就是在ui与ui之间显示一个模型。而我们模型是用3d渲染的,如果直接放一个模型上来。那么就会导致要么模型永远在ui上面,要么ui永远在模型上面,达不到我们想要的模型夹在两个ui之间的效果。
要做到这个效果,就会考虑到用rt来解决,具体就是在一个ui上的一个节点上创建一个UITexture
这个UITexture关联一个rt(可以动态创建或静态指定),并给他一个shader(注意这个shader很关键)
然后我们要在渲染3d模型的摄像头上关联rt和要渲染的层级等内容(注意这个rt和UITexture的rt是同一个rt,可以代码动态指定)
然后就可以把角色渲染到这个节点上了。
刚开始大家可能会看到这个效果,发现角色旁边全是黑的。
这是因为我们的摄像机选择清理方式是颜色清理并且颜色是黑色。就算你把alpha去掉也会有一层黑色在(因为存到rt上会把颜色补上)。
这时候自然而然会想到用混合的方式把颜色去掉,然后用混合的话最开始想到的是用最平台用的混合方式
Blend SrcAlpha OneMinusSrcAlpha
得到的结果是
咋一看感觉好了,其实不然,我们要注意之前的角色是有特效的,而这个角色的特效不见了
也许是透明度还没渲染出来,但是我们再仔细看,依附再翅膀上的特效其实是显示出来了,只是不在身体上的特效没显示出来。
如果是这样,也就是说前景色被裁剪了。其实我们不想被裁剪掉的,所以我们需要把前景直接设置为One。
Blend One OneMinusSrcAlpha
现在显示正常了
Shader "Unlit/ColorReset"
{
Properties
{
_MainTex("Base (RGB), Alpha (A)", 2D) = "black" {}
_Color("Color", Color) = (0,0,0,1)
}
SubShader
{
LOD 200
Tags
{
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "Transparent"
}
Pass
{
Blend One OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;
half4 _Color;
struct appdata_t
{
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
half2 texcoord : TEXCOORD0;
fixed4 color : COLOR;
};
v2f vert(appdata_t v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.texcoord = v.texcoord;
return o;
}
fixed4 frag(v2f IN) : SV_Target
{
half4 color = tex2D(_MainTex, IN.texcoord);
return color;
}
ENDCG
}
}
}
另外:如果用的是Blend SrcColor OneMinusSrcAlpha的话也可以看到特效,但会看到饱和度很高,因为颜色相当于double了
————————————————
版权声明:本文为优快云博主「VT LI」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。