前几天,面试官问我图形学的知识,先是扯深度缓冲,又扯如何渲染的,渲染顺序。
我一脸懵逼的回答:需要一些算法吧?比如画家算法啥的。先渲染最外层的物体,然后通过深度缓冲来渲染前面的物体进行覆盖吧啦吧啦吧啦。
面试官:深度缓冲是什么。一定要按顺序渲染吗?透明度混合咋办。(透明度混合我先提出来的,面试官就追问)
我当时就给答错了,我:透明度混合,必须要把深度测试关了(其实并不是这样,听我稍后解释),然后呢,必须要设置渲染队列,对,必须要设置渲染队列,不然效果不一样。
最后二面挂了(没错就是你吉比特挂的我,虽然说我大三投校招也不太厚道咯)。
为此,就是要引出透明度混合。(其实上面毫无逻辑的原因是我忘了面试内容了,哈哈哈,只记得大概)。
透明度混合还是非常重要滴,这里将引用(抄袭)《Unity shader入门精要》里面的话来回答。
目录
Unity中通常使用两种方法来实现透明效果
- 透明度测试:这种方法是无法得到真正半透明的效果。
- 透明度混合。
透明度测试:
它采用一种极其霸道的方式,只要一个片元的透明度满足不了要求(通常是小于某个阈值),那么它对应的片元就会被舍弃。被舍弃的片元将不会再进行任何处理。也不会对颜色缓冲产生任何影响:否则,就会按照普通的不透明物体的处理方式来处理它,即进行深度测试,深度写入等。也就是说,透明度测试是不需要关闭深度写入的,它和其他不透明物体最大的不同就是它会根据透明度来舍弃一些片元。虽然简单,但它实现的效果也很极端,要么完全透明,即看不到,要么完全不透明,就像不透明物体那样。(正文)
处理方式:
开启深度写入!!!,处理片元只有两种方式:1.满足不了要求:舍弃。2.满足要求:按不透明物体处理。
效果:
要么完全透明要么完全不透明。
效果很差,因此出现了透明度混合的处理方式。
透明度混合:
这种方式可以得到真正的半透明效果。它会使用当前片元的透明度作为混合因子,与已经存储在颜色缓冲中的颜色值进行混合,得到新的颜色。但是透明度混合需要关闭深度写入(我们下面会将为什么需要关闭),这使得我们要非常小心物体的渲染顺序。需要注意的是,透明度混合只关闭了深度写入,但没有关闭深度测试。这意味着,当使用透明度混合渲染一个片元时,还是会比较它的深度值与当前深度缓冲中的深度值,如果它的深度值距离摄像机更远,那么就不会再进行混合操作。这一点决定了,当一个不透明物体出现在一个透明物体的前面,而我们先渲染了不透明物体,他仍然可以正常地遮挡住透明物体。也就是说,对于透明度混合来说,深度缓冲是只读的。(正文)
想不到吧,我面试竟然答错了。深度测试还开着,只是关闭了深度写入!!!
处理方式:
关闭了深度写入,深度测试还开着,将当前片元的透明度作为混合因子,与颜色缓冲中的颜色进行混合。
效果:
正真的半透明效果。
至于一些细节的地方,浏览量满500再更。加油,冲! 到时候再使用unity实现一下哈。
处理方式 | 效果 | |
透明度测试 | 开启深度写入!!!,处理片元只有两种方式:1.满足不了要求:舍弃。2.满足要求:按不透明物体处理。 | 要么完全透明要么完全不透明。 效果很差,因此出现了透明度混合的处理方式。 |
透明度混合 | 关闭了深度写入,深度测试还开着,将当前片元的透明度作为混合因子,与颜色缓冲中的颜色进行混合。 | 正真的半透明效果。 |