Shaderlab Notizen 3 剔除、深度测试、Alpha测试以及雾效

一、Culling & Depth Testing
1.1 Culling
对于实时交互的3D环境而言,现实的速度和效率是非常重要的。虽然现在的硬件能力非常的快,但是要想保持30FPS的同时处理数十万的三角形,以现在的主流机器来说还是有些困难的。
为了解决这种问题,人们提出了很多方法,其中有LOD,有Culling。这两种方法并不矛盾,而且我们往往需要在culling的基础上再使用LOD进一步解决pipeline的负担。
剔除是一种通过避免渲染背对观察者的几何体面来提高性能的优化措施。所有几何体都包含正面和反面。剔除基于大多数对象都是封闭的事实;如果你有一个立方体,你不会看到背离你的那一面(总是只有一面在你的前方),因此我们不需要绘制出背面。因此也被称做背面剔除。
一言以蔽之,所谓剔除,就是被挡住或视角以外的我们看不到的物体,因为它们无关紧要,所以我们就不去绘制,以节省资源,提高场景的运行效率。

Shaderlab Notizen 3 剔除、深度测试、Alpha测试以及雾效_第1张图片
Paste_Image.png

1.2 Depth Testing
在复杂的场景中,通常有多个物体需要绘制,这些物体之间通常会存在遮挡关系,离观察点较远的物体会因为近处物体的者的遮挡而不可见或只有部分可见,Direct3D图形系统提供了深度测试功能来实现这种效果。深度测试可以简化复杂场景的绘制,确保只有场景内的对象的最靠近的表面参与绘制。

1.3 Culling & Depth Testing基本语法
语句之一:Cull Back | Front| Off
此语句用于控制几何体的哪一面会被剔除(也就是不被绘制) 。其中:
Cull Back—— 不绘制背离观察者的几何面
Cull Front—— 不绘制面向观察者的几何面,用于由内自外的旋转对象
Cull Off —— 显示所有面。用于特殊效果。

语句之二:ZWrite On | Off
此语句用于控制是否将来之对象的像素写入深度缓冲(默认开启),如果需要绘制纯色物体,便将此项打开,也就是写上ZWrite On。如果要绘制半透明效果,关闭深度缓冲,则用ZWrite Off。

语句之三:ZTest Less |Greater | LEqual | GEqual | Equal | NotEqual | Always
此语句用于控制深度测试如何执行。
缺省值是LEqual (绘制和存在的对象一致或是在其中的对象;隐藏其背后的对象),含义列举对应如下:

Greater 只渲染大于AlphaValue值的像素

GEqual 只渲染大于等于AlphaValue值的像素

Less 只渲染小于AlphaValue值的像素

LEqual 只渲染小于等于AlphaValue值的像素

Equal 只渲染等于AlphaValue值的像素

NotEqual 只渲染不等于AlphaValue值的像素

Always 渲染所有像素,等于关闭透明度测试。等于用AlphaTest Off

Never 不渲染任何像素

语句之四:Offset Factor ,Units
此语句用两个参数(Facto和Units)来定义深度偏移。
Factor参数表示 Z缩放的最大斜率的值。
Units参数表示可分辨的最小深度缓冲区的值。

二、Alpha Testing
2.1 概念
Unity中,Alpha测试(Alpha Testing)是阻止像素被写到屏幕的最后机会。在Pineline中Alpha测试的位置如下:

Shaderlab Notizen 3 剔除、深度测试、Alpha测试以及雾效_第2张图片
Paste_Image.png

在最终渲染出的颜色被计算出来之后,可选择通过将颜色的透明度值和一个固定值比较。如果比较的结果失败,像素将不会被写到显示输出中。

Alpha测试在渲染凹形物体的透明部分时非常有用。显卡上有着每个像素写到屏幕上的深度记录。如果一个新的像素比原来的像素的深度深,那么新的像素就不会被写到屏幕中。

2.2 Alpha测试相关语句

语句之一:AlphaTest Off
此语句用于渲染所有像素

语句之二:AlphaTest comparison AlphaValue
此语句用于设定透明度测试只渲染在某一确定范围内的透明度值的像素。其中的comparison取值为下表之一:
Greater Only render pixels whose alpha is greater than AlphaValue. 大于

GEqual

Only render pixels whose alpha is greater than or equal to AlphaValue. 大于等于

Less

Only render pixels whose alpha value is less than AlphaValue. 小于

LEqual

Only render pixels whose alpha value is less than or equal to from AlphaValue. 小于等于

Equal

Only render pixels whose alpha value equals AlphaValue. 等于

NotEqual

Only render pixels whose alpha value differs from AlphaValue. 不等于

Always

Render all pixels. This is functionally equivalent to AlphaTest Off.
渲染所有像素,等于关闭透明度测试AlphaTest Off

Never

Don't render any pixels. 不渲染任何像素

而AlphaValue为一个范围在0到1之间的浮点值。也可以是一个指向浮点属性或是一个范围属性,在后一种情况下需要使用标准的方括号写法标注索引名字,如([变量名]).

三、雾效设置
3.1 雾效
雾效(Fog)参数用于控制雾相关的渲染。
在计算机图形学中,雾化是通过混合已生成的像素的颜色和基于到镜头的距离来确定的最终的颜色来完成的。雾化不会改变已经混合的像素的透明度值,只是改变RGB值。

Shaderlab Notizen 3 剔除、深度测试、Alpha测试以及雾效_第3张图片
Paste_Image.png

Unity中的缺省雾设定是基于Edit->RenderSettings中的设置的,且雾模式既可以是Exp2也可以是关闭;密度和颜色完全取自设定。
注意如果使用了片段着色器的话,着色器中的雾设定仍然是有效的。如果平台没有对固定管线的雾功能支持,Unity会实时补上着色器以支持需要的雾模式。

3.2 相关语句

语句之一:Fog { FogCommands }
此语句用于设定雾命令的内容,具体的填在大括号之中的内容见下面的语句。

语句之二:Mode Off | Global | Linear | Exp | Exp2
此语句用于定义雾模式。缺省是全局的,依据雾在渲染设定中是否打开确定可从无变化到平方值

语句之三:Color ColorValue
此语句用于设定雾的颜色值。

语句之四:Density FloatValue
此语句以指数的方式设定雾的密度。

语句之五:Range FloatValue , FloatValue
此语句用于为linear类型的雾设定远近距离值。

你可能感兴趣的:(Shaderlab Notizen 3 剔除、深度测试、Alpha测试以及雾效)