ShaderLab学习小结(十三)物体被遮挡部分也能显示颜色-创新互联

目标:两个cube,cube1在前,默认不透明白色,cube2在后,蓝色,部分被cube1遮挡
被遮挡部分也要显示,并显示为绿色
如下图:
ShaderLab学习小结(十三)物体被遮挡部分也能显示颜色
一步一步来,我们先实现被遮挡部分能显示
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
        }
    }
}

效果如下图:
ShaderLab学习小结(十三)物体被遮挡部分也能显示颜色
如图,只有被遮挡的地方显示出来了,没被遮挡的地方不见了。
先看显示出来的部分
先看这一句

zwrite on                                //2.

查看官方文档:点击查看
ShaderLab学习小结(十三)物体被遮挡部分也能显示颜色
是否写入深度缓冲区,默认是on,所以这句这里不写也是一样的。

ztest greater                         //1.

实现这个效果就在这一句,深度测试
看看unity官方文档里怎么说的:点击查看
ShaderLab学习小结(十三)物体被遮挡部分也能显示颜色
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许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


网页名称:ShaderLab学习小结(十三)物体被遮挡部分也能显示颜色-创新互联
转载注明:http://lszwz.com/article/pjjgs.html

其他资讯

售后响应及时

7×24小时客服热线

数据备份

更安全、更高效、更稳定

价格公道精准

项目经理精准报价不弄虚作假

合作无风险

重合同讲信誉,无效全额退款