概述

  1. 渲染控制指令
  2. 透明的实现

裁剪命令

在引擎中,模型一般不会渲染背面,因为往往用户看不到,渲染背面,还会消耗GPU性能,但是可以再Shader中控制裁剪类型

注意:裁剪命令是写在pass通道的。
|裁剪类型|说明|
|-------|-------|
|Cull 值(Front、Back、Off)|编写在Pass通道内|
|Back|裁剪模型背面,不显示模型的背面(默认值|
|Front|裁剪模型正面,不显示模型的正面|
|Off|不裁剪,全部都显示|

Shader "DY/Cull"
{
    Properties
    {
        _Color("颜色", Color) = (1, 1, 1, 1)
	}
	
	SubShader
	{
		Pass
		{

			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
        }
    }
}

渲染顺序

默认的渲染顺序原则:距离相机越近,则渲染越靠前,非透明情况下,靠前的物体会盖住靠后的物体
如下图显示:红色、绿色、蓝色,依次离摄像机的距离越来越远。
image.png

深度:被渲染的物体,到摄像机的距离
深度测试:比较当前渲染的物体的深度值
深度写入:当深度测试确定需要替换颜色时,将需要显示的颜色对应的深度信息写入深度缓冲区

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

image.png

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

注意:不同的屏幕的颜色缓冲区和深度缓冲区是不一样的。

深度测试
|ZTest表示深度测试通过的条件|说明|
|-------|-------|-------|
|Off|深度测试永远通过,同Always|
|Less|比深度缓冲区中深度值小时,测试通过|
|LEqual(默认值)|比深度缓冲区中深度值小或相等时,测试通过|
|Euqal|比深度缓冲区中深度值相等时,测试通过|
|NotEqual|比深度缓冲区中深度值不相等时,测试通过|
|Greater|比深度缓冲区中深度值大时,测试通过|
|GEqual|比深度缓冲区中深度值大于等于时,测试通过|
|Always|深度测试永远通过|

Pass{
  // ZTest 深度测试写在pass通道内
  ZTest Alaway
}

测试通过后,颜色会写入颜色缓冲区中,但是屏幕最终显示的颜色,不一定是当前物体上的颜色,前方还可能有物体

渲染类型

SubShader
{
  Tags {"RenderType": "Opaque"}
  Pass {}
}
渲染类型说明
不透明物体使用Opaque
透明物体使用Transparent

深度写入

Pass 
{
  ZWrite On // 开启深度写入
  ZWrite Off // 关闭深度写入
}

ZWrite控制深度测试成功后,是否进行深度写入
当深度写入关闭时,即使深度测试完全通过,颜色缓冲区不会被写入,必须
将深度的物体,放置在Transparent队列下,颜色缓冲区的更新才会正常Unity内置的透明物体 Shader,会关闭深度写入

当透明物体在前,非透明物体在后,深度测试都使用默认状态,深度写入保持开启,结果会出现透明物体正常显示,非透明物体被透明物体遮盖的部分,会显示为透明物体颜色