裁剪+渲染队列+透明与混合
裁剪命令
在引擎中,模型一般不会渲染背面,因为往往用户看不到,渲染背面,还会消耗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 OffCGPROGRAM#pragma vertex vert#pragma fragment fragfixed4 _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通道使用可实现颜色叠加,例:红+绿=黄)
该系列专栏为网课课程笔记,仅用于学习参考。