裁剪+渲染队列+透明与混合

裁剪命令

        在引擎中,模型一般不会渲染背面,因为往往用户看不到,渲染背面,还会消耗GPU性

        能,但是可以再Shader中控制裁剪类型。

        Cull值(Front|Back|Off),编写在Pass通道内

                Back:裁剪模型背面,不显示模型的背面(默认值)

                Front:裁剪模型正面,不显示模型的正面

                Off:不裁剪,全部都显示。

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "CreateTest/Cull"
{
    Properties
    {
        _Color("Color",Color) = (1,1,1,1)
    }
    SubShader
    {
        Pass
        {
            //裁剪命令
            //裁剪哪个面,哪个面消失
            //Back:不显示背面
            //Front:不显示正面
            //Off:正反都显示
            Cull Off
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            fixed4 _Color;
            float4 vert(float4 vertex:POSITION) :SV_POSITION
            {
                return UnityObjectToClipPos(vertex);
            }
            fixed4 frag(float4 pos:SV_POSITION) : SV_Target
            {
                return _Color;
            }
            ENDCG
        }
    }
    Fallback "Diffuse"
}

下图绿色平面为实现以上Shader效果的平面,通过Cull Off指令,可使背面被裁剪的面显示(选中为挂载Standard Shader的平面):

渲染顺序

        默认的渲染顺序原则:距离相机越近,则渲染越靠前,非透明情况下,靠前的物体会盖住

        靠后的物体。

        深度:被渲染的物体,到摄像机的距离

        深度测试:比较当前渲染的物体的深度值。

        深度写入:当深度测试确定需要替换颜色时,将需要显示的颜色对应的深度信息写入深

        度缓冲区。

        深度缓冲区

Unity会为屏幕的每个点,设定一个存储有当前渲染的颜色的深度值(相机到颜色点物体的距离),物体如果在摄像机视角上发生重叠后,需要计算每个重叠点像素的深度值,如果被渲染物体的深度值小于已经存储在深度缓冲区内的值,则将被渲染物体的像素点颜色替换掉原有的颜色。默认的深度值是正无穷。

        颜色缓冲区:与深度缓冲区中像素点一一对应,存储有最终显示在屏幕上的颜色信息,就

        一个像素点而言,应该存储有一个颜色信息。

深度测试

        ZTest表示深度测试通过的条件

                Off:深度测试永远通过,同Always

                Less:比深度缓冲区中深度值小时,测试通过

                LEqual(默认值):比深度缓冲区中深度值小或相等时,测试通过

                Euqal:比深度缓冲区中深度值相等时,测试通过

                NotEqual:比深度缓冲区中深度值不相等时,测试通过

                Greater:比深度缓冲区中深度值大时,测试通过

                GEqual:比深度缓冲区中深度值大于等于时,测试通过

                Always:深度测试永远通过

        编写方法:

        测试成功,颜色会写入颜色缓冲区中,但是屏幕最终显示的颜色,不一定是当前物体上

        的颜色,前方还可能有物体。

渲染类型

        不透明物体,使用Opaque

        透明物体,使用Transparent

        ZWrite:控制深度测试成功后,是否进行深度写入

                On:开启写入

                Off:关闭写入

        当深度写入关闭时,即使深度测试完全通过,颜色缓冲区不会被写入,必须将深度的物

        体,放置在Transparent队列下,颜色缓冲区的更新才会正常,Unity内置的透明物体

        Shader,会关闭深度写入。

        当透明物体在前,非透明物体在后,深度测试都使用默认状态,深度写入保持开启,结果

        会出现透明物体正常显示,非透明物体被透明物体遮盖的部分,会显示为透明物体颜色。

渲染队列

        渲染顺序:是从小向大依次渲染

        Background(1000):最早被渲染的队列值,(天空盒,背景等)

        Geometry(2000):默认队列,不透明物体的队列值

        AlphaTest(2450):透明度测试队列

        Transparent(3000):渲染透明物体存放的队列

        Overlay(4000):需要覆盖显示的队列(镜头光晕)

        添加方法:

        查看渲染队列的方法:

        discard用法示例:

//前面的代码同纹理采样文章代码
fixed4 frag(v2f data):SV_Target
{
    //通过Tex2D,解出主纹理对应的颜色值
    fixed4 texColor=tex2D(_MainTex,data.uv);
    if(texColor.a<0.5)  //如果纹理颜色的透明度值小于0.5
    {
        discard;//丢弃小于0.5的像素
    }
    //混色采用向量乘法实现
    return texColor * _Color;
}
颜色混合

        光的混合方式

                Color(r,g,b,a)*倍数=Color(r*倍数,g*倍数,b*倍数,a*倍数)

                Color1(r,g,b,a)+Color2(r,g,b,a)=Color3(r1+r2,g1+g2,b1+b2,a1+a2)

                Color1(r,g,b,a)*Color2(r,g,b,a)=Color3(r1*r2,g1*g2,b1*b2,a1*a2)

        命令

                Blend SrcFactor DstFactor

        混合公式

                最终的颜色=新颜色*SrcFactor+旧颜色*DstFactor

                旧颜色:上一个Pass通道,颜色缓冲区

                新颜色:当前Pass通道的颜色

        常用系数

         常用混合方式     

                        //线性减淡(Linear Dodge)

                        Blend One One

        常用混合模式

                半透明物体使用的混合模式:Blend SrcAlpha OneMinusSrcAlpha

                颜色叠加:Blend One One(在第二个Pass通道使用可实现颜色叠加,例:红+绿=黄)

该系列专栏为网课课程笔记,仅用于学习参考。      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值