如何在UI之间正确的显示3D模型

        我们在做角色渲染时,通常会遇到一种情况,就是在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了

猜你喜欢

转载自blog.csdn.net/llsansun/article/details/86677480#comments_19174908