在实时渲染中要实现透明效果,通常会在渲染模型时控制它的透明通道。当开启透明混合后,当一个物体被渲染到屏幕上时,每个片元除了颜色值和深度值外,它还有另一个属性--透明度。
Unity中常用两种方式来实现透明效果:第一种是透明度测试,这种其实无法得到真正的半透明效果;另一种是透明度混合。
从渲染顺序看,对于不透明(opaque)物体,我们不需要考虑它的渲染顺序,因为深度缓冲区(depth buffer)已经帮我们处理好了,它会根据片元深度值和深度缓冲中的值作比较(开启深度测试情况下),当其值距摄像机更远时,则不会渲染,否则会覆盖掉颜色缓冲中的像素,并把深度值更新到深度缓冲中(开启深度写入情况下)。
但要实现透明效果就不能这么做了,因为当使用透明度混合时,我们关闭了深度写入(ZWrite).
透明度测试和透明度混合的基本原理如下:
透明度测试:只有一个片元的透明度不满足条件(通常是小于某个阙值),那么它对应的片元就会被舍弃。被舍弃的片元将不会再进行任何处理,也不会对颜色缓冲产生任何影响。否则会被当做不透明处理,进行深度测试,深度写入等。所以透明度测试是不需要关掉深度写入的。除了会舍弃片元,其实和不透明物体渲染差不多。
透明度混合:这种方法可以得到真正的半透效果。它会使用当前片元的透明度作为混合因子,与颜色缓冲中的颜色进行混合,得到新的颜色。这里需要注意,透明度混合需要关闭深度写入。但没有关闭深度测试,所以当混合渲染一个片元时,它还是会比较它的深度和深度缓冲中的深度,如果它的深度值离摄像机更远,则不再进行混合操作。所以当不透明物体在透明物体前面时,先渲染了不透明物体,它仍可以遮挡主透明物体。所以对于透明度混合来说,深度缓冲只是可读的。
渲染顺序很重要
为什么透明度混合要关闭深度写入呢?如果不关闭深度写入,一个半透明表面背后的表面本来是可以透过它被看到的,但由于深度测试时该半透明表面离摄像机更近,导致后面的表面会被剔除,那就无法透过半透明表面看到后面物体了。但是这样也同时破坏了深度缓冲的工作机制,所以渲染顺序就非常重要了。
根据上图我们看看不同的渲染顺序会有什么结果:
1、先渲染B,再渲染A,由于不透明物体开启了深度测试和写入,所以B会先写入颜色缓冲和深度缓冲。然后渲染A,深度测试发现A离摄像机更近,则用A的透明度来和颜色缓冲中的B的颜色混合,得到正确结果。
2、先渲染A,再渲染B,A是半透,则先写入颜色缓冲,但
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务