XNA中的深度缓冲区和alpha问题

时间:2013-02-05 08:40:51

标签: .net xna xna-4.0 depth-buffer

我正在显示BasicEffect的许多实例,每个实例都是一个“板”,随机选择四种纹理之一,部分透明或完全不透明。

我遇到的问题是,当渲染具有透明度的印版时,只有已经渲染的印版才会显示出来。

很难解释所有内容的显示方式here is the image

是否有一种解决方案比以正确的顺序呈现更简单?

1 个答案:

答案 0 :(得分:2)

深度缓冲区存储在该位置绘制的最顶部像素的“深度”。当您尝试在该位置绘制另一个像素时,如果它的深度值高于当前在缓冲区中的值,它将被绘制到颜色缓冲区,其深度值将替换该值中的值。深度缓冲。但是如果另一个像素的深度值低于缓冲区中的值 - 则不会绘制它,并且深度缓冲区中的值保持不变。

这样做的结果是深度缓冲区无法按预期使用透明像素。透明像素可能只会导致颜色缓冲区的部分更改 - 但它会完全替换深度缓冲区中的值。没有办法在它下面绘制。

有两种方法可以解决这个问题:

您可以使用 alpha测试,这会导致根本不渲染透明像素(并且不会更改深度缓冲区)。这允许几何体通过透明区域显示,与绘图顺序无关。缺点是这在抗锯齿方面效果不佳(对抗锯齿选项here进行了很好的讨论)。

或者您可以按照从前到后的顺序对几何体进行排序。如果先绘制不透明几何体,则只需对透明几何体进行排序。