shader入门基础-透明效果一
本文内容主要参考 《Unity shader 入门精要》一书,旨在总结所学知识与加深个人理解
透明度测试(Alpha Test)
当片元的透明度小于某个阈值时,对应片元就会被舍弃,被舍弃的片元不会再进行任何处理,不会对颜色缓冲产生任何影响,当片元透明度大于等于这个阈值的 时候,就会按照普通不透明的物体处理方式来处理,进行深度测试,深度写入等。透明度测试无法得到真正的半透明效果。
透明度混合(Alpha Blend)
使用当前片元的透明度作为混合银子,与已经存储在颜色缓冲中的颜色进行混合,得到新的颜色。但是透明度混合需要关闭深度写入,关闭深度写入破坏了深度 缓冲的工作机制,因此渲染渲染顺序将会变得非常重要。透明度混合只关闭了深度写入,没有关闭深度测试,当使用透明度混合渲染一个片元时,还是会比较 它的深度值与当前缓冲中的深度值,如果它的深度值距离摄像机更远,那么就不会再进行混合操作。对于透明度混合来说,深度缓冲时只读的。
深度缓冲(depth buffer,z-buffer)
深度缓冲记录颜色缓冲区中相对应像素点在 3D 世界中距离摄像机的远近,通过深度缓冲,我们可以进行深度测试,从而确定遮挡关系。有了深度缓冲后,渲染顺序 就不那么重要了,可以根据深度渲染物体。上面提及的透明度混合的时候会关闭深度写入,因此关闭深度写入时,渲染顺序会确定物体渲染的先后顺序,关闭后, 渲染顺序会变得非常重要。
深度测试(ZTest) 深度写入(ZWrite)
如果开启了看深度测试,GPU 会把该片元的深度值和已经存在于深度缓冲区中的深度值进行比较。如果该片元通过了深度测试,开发者可以指定是否用这个片元 的深度值覆盖掉原有的深度值,这个是通过开启/关闭深度写入来做到。 这里回顾之前渲染流水线的知识,可以加深理解,这部分的操作都在渲染流水线的逐片元操作中。通过流程图可以理解,这部分的工作流程和再流水线中的作用。 逐片元在流水线最后,这里会合并输出。
逐片元操作
深度写入和深度测试工作流程图
混合流程工作流程图
渲染顺序的排序
渲染引擎一般会对物体进行顺序。
- 先渲染所有不透明物体,并开启它们的深度测试和深度写入。
- 把半透明物体按它们距离摄像机的远近进行排序,然后按照从后往前的顺序渲染这些半透明物体,并开启它们的深度测试,但关闭深度写入。
渲染队列
Unity 为了解决渲染顺序问提供了渲染队列(render queue),用 SubShader 的 Queue 标签决定我们模型将归于哪个渲染队列。
透明度测试
1
2
3
4
5
SubShader{
Tags{"Queue"="AlphaTest"}
Pass{
}
}
透明度混合
1
2
3
4
5
6
SubShader{
Tags{"Queue"="Transparent"}
Pass{
Zwrite Off
}
}