目标:两个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 oneminu***calpha
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 oneminu***calpha
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,即我们给的蓝色。
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款