日历

最新评论及回复

最近发表

Search

我在这里: 首页 » Alchemy3D » 浏览文章: 深度缓冲和Alpha混合
« 地形实现基于矩阵的纹理坐标变换 »

深度缓冲和Alpha混合

 

相信大部分引擎开发者也碰到这样一个大问题——使用了alpha混合后出现某些面片的混合颜色不正确,请先让我解释一下问题的原因。

当绘制一个3D场景时, 对图形进行深度排序是非常重要的, 这样离镜头近才画在远处物体的前面. 我们不会希望看到远处的山把近在眼前的建筑给挡住了!

如今有如下排序方法得到了广泛的应用:

深度缓冲 (也叫做 z-buffering)
画家算法
不幸的是, 每种都有其局限性. 为了达到好的结果, 大多数引擎是把三种方法结合起来使用的.而这里只讨论本引擎使用的深度缓冲.

为什么说深度缓冲对alpha混合无能力为?这是因为深度缓冲只记录了当前已经绘制的最近像素. 对于不透明的物体, 这已经能够满足我们的需要了. 看一下这个绘制两个三角形的例子, A和B:


如果我们先画B再画A, 深度缓冲会看到新的像素(A的)比之前的(B的)要近, 那么它就画在了前面. 如果我们用相反的顺序画(先A后B), 深度缓冲会看到B的像素比之前A已经画的要远, 所以就把它们给丢弃掉了. 无论哪种情况我们都会得到正确的结果: A在前面, B隐藏在后面.

但是当这些几何图形是透明的, 即B透过A是部分可见的时会怎样呢? 如果我们先画B再画A的话是没有问题的, 但反过来就不行了. 在这种情况下, 深度缓冲会从B取一个像素, 同时注意到已经绘制了一个更近的像素(A的), 然后它就没辙了! 唯一的选择是绘制B(这会得到一个错误的结果, B会画在A前面, 但A的alpha 混合却没有起作用), 或者完全抛弃B.

那么如何解决使用深度缓冲下的alpha混合问题?本人不才,只知道除了再进行一次画家算法外,再想不到更好的方法了.但总所周知,画家算法是不精确的,也就是经常提及到的破面产生的同一个道理.如下图,我们根本无法确定那个面片在前,哪个在后:

除非我们对面片进行裁剪,这是任何引擎都无法承受的灾难!

Linfuqing曾经提及到这样一个算法,我们可以绘制所有像素,如果发现透明的面片比屏幕像素远,则交换屏幕像素和此像素的混合顺序,而透明公式dest = src1 * alpha + src2 * (1 - alpha)则用dest = src1 * src1_alpha + src2 * src2_alpha代替,即用屏幕像素的透明度代替了1-alpha,结果看似正确,但可惜这很难对付当多个面片重叠而且顺序不确定的情况.

再google了一番,发现一篇<Tags: 深度缓冲  zbuffer  alpha  

发表评论

为了防止SPAM,含链接的评论需要审核后才能显示。

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。