2013-02-05 32 views
1

我正在显示BasicEffect的许多实例,每个实例都是一个“板”,随机选择四个纹理之一,部分透明或完全不透明。XNA中的深度缓冲区和alpha问题

我遇到的问题是,当透明板被渲染时,只有已经渲染的板显示透过它。

很难解释如何显示所有东西,所以here is the image

有没有一种解决方案比以正确的顺序渲染更简单?

+0

许多'BasicEffect'实例?您可能可以重新使用单个实例。 –

+0

@Andrew我打算动态生成地形,所以如果我的想法正确,我将不得不更新整个VertexBuffer,如果一个垂直会发生变化。对于在屏幕截图中显示的几何图形来说可以,但对于我的情况可能不会。请告诉我,如果我错过了什么,我是新来的XNA。 – Sebi

+0

效果和顶点缓冲区是独立的。您可以有多个缓冲区并使用该效果的单个实例。如果您经常修改顶点缓冲区,请考虑使用'DynamicVertexBuffer' –

回答

2

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

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

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

你可以使用alpha测试,这将导致透明像素完全不被渲染(而不是改变深度缓冲)。这允许几何图形通过透明区域显示,与绘制顺序无关。缺点是,这不适用于抗锯齿(有关抗锯齿选项here的良好讨论)。

或者你可以按照先后顺序排序几何图形。如果先绘制不透明几何体,则只需对透明几何体进行排序。

+0

谢谢您的全面解释,现在一切都清楚了。非常感谢 :) – Sebi