ShaderLab学习小结(十三)物体被遮挡部分也能显示颜色
  5WVVrgL6K2nc 2023年11月02日 25 0

目标:两个cube,cube1在前,默认不透明白色,cube2在后,蓝色,部分被cube1遮挡 被遮挡部分也要显示,并显示为绿色 如下图: 一步一步来,我们先实现被遮挡部分能显示 Shader代码:

Shader "Custom/TestZwriteAlpha" {
	Properties{
		_MainColor("Main Color", color) = (0,0,1,0.3)
		_OutColor("Out Color", color) = (1,1,0,0.5)
	}
	SubShader {
		Tags{"queue" = "transparent"}
		pass {
			blend srcalpha oneminussrcalpha
			ztest greater                         //1.
			zwrite on                                //2.
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "unitycg.cginc"
			fixed4 _MainColor;
			fixed4 _OutColor;
			struct v2f {
				float4 pos:POSITION;
			};
			v2f vert(appdata_base v)
			{
				v2f o;
				o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
				return o;
			}
			fixed4 frag(v2f IN):COLOR
			{
				return _OutColor;
			}
			ENDCG
		}
	}
}

效果如下图: 如图,只有被遮挡的地方显示出来了,没被遮挡的地方不见了。 先看显示出来的部分 先看这一句

zwrite on                                //2.

查看官方文档:点击查看 是否写入深度缓冲区,默认是on,所以这句这里不写也是一样的。

ztest greater                         //1.

实现这个效果就在这一句,深度测试 看看unity官方文档里怎么说的:点击查看 Less小于,Greater大于,LEqual小于等于,GEqual大于等于,Equal等于,NotEqual不等于,Always总是 默认是LEqual小于等于,解释是绘制距离小于等于此物体的物体,在此物体后面的被遮挡隐藏 也就是说默认情况下,只绘制能挡住它的物体以及它本身不被挡住的部分,而被它挡住的物体不绘制。 而本例用了ztest greater,大于 那就是相反的,只绘制它被挡住的部分,且在fragment中返回了一个绿色的_OutColor, 所以就出现了上图的效果,没有被遮挡的部分就不会被绘制,也就消失不见了。 那么,为了能让没有被遮挡的部分也能显示,显然要再加一个pass通道

pass {
		blend srcalpha oneminussrcalpha
		ztest less                 //3.
		zwrite on
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#include "unitycg.cginc"
		fixed4 _MainColor;
		fixed4 _OutColor;
		struct v2f {
			float4 pos:POSITION;
		};
		v2f vert(appdata_base v)
		{
			v2f o;
			o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
			return o;
		}
		fixed4 frag(v2f IN) :COLOR
		{
			return _MainColor;
		}
		ENDCG
	}

注意,这里用了

ztest less                 //3.

如上所述,把该物体没被遮挡的部分也绘制出来,使用_MainColor,即我们给的蓝色。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  jo5M4GCiOHdG   2023年11月12日   18   0   0 Unity教程Unity
5WVVrgL6K2nc