温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-06-08 15:33:21 来源:网络 阅读:2355 作者:lreach 栏目:游戏开发

目标:两个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,即我们给的蓝色。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI