2

因此,我试图找出在 OpenGL 中渲染 3D 模型的最佳方法,因为它的某些纹理具有 alpha 通道。

当我启用深度缓冲区并开始绘制 3D 模型中的所有三角形时,如果它绘制了一个位于模型中另一个三角形前面的三角形,它在到达它时根本不会渲染后三角形。问题是当前面的三角形具有 alpha 透明度时,应该可以看到后面的三角形,但后面的三角形仍然没有渲染。

禁用深度缓冲区消除了这个问题,但会产生一个明显的问题,即如果三角形不透明,那么如果在之后渲染,它仍然会在其后面渲染三角形。

例如,我正在尝试渲染一棵松树,它基本上是一些相互堆叠的具有透明底座的锥体。下图显示了启用深度缓冲区时出现的问题:

启用深度缓冲区

您可以看到仍然可以看到透明三角形的轮廓。

下图显示了禁用深度缓冲区时的样子。

深度缓冲区已禁用

在这里,您可以看到树后面的一些三角形是如何在树的其余部分前面渲染的。

任何想法如何解决这个问题,并正确渲染松树?

PS我正在使用着色器来渲染一切。

4

3 回答 3

5

如果您没有使用任何部分透明度(一切都是 0 或 255),您可以glEnable(GL_ALPHA_TEST)这应该对您有所帮助。问题是,如果您首先渲染顶部圆锥,它会将整个四边形放入 z 缓冲区(甚至是透明部分),因此下方的较低分支在绘制时会被 z 拒绝。如果像素未通过 alpha 测试(使用 glAlphaFunc 设置),则启用 alpha 测试不会将像素写入 z 缓冲区。

如果要使用部分透明度,则需要从后到前或从下到上对渲染对象的顺序进行排序。

您还需要启用 z-buffer。

[编辑] 哎呀,我意识到当您使用着色器时,我不相信这些功能会起作用。在着色器情况下,如果 alpha 值接近于零,您希望在片段着色器中使用丢弃函数。

if(color.a < 0.01) {
   discard;
} else {
   outcolor = color;
}
于 2012-03-10T02:53:57.023 回答
0

You needs to implement a two-pass algorithm.

The first pass render only the back faces, while the second pass render only the front faces.

In this way you don't need to order the triangles, but some artifacts may occour depending whether your geometry is convex or not.

于 2012-10-21T16:16:44.467 回答
-2

我可能是错的,但这是因为当您在 3d 中渲染时,您不会使用 Directx 的默认设置渲染三角形的背面,当 Z 被移除时 - 它会按顺序绘制它们,而 Z 上的 Z 不会绘制三角形的背面三角形了。即使启用了 Z,也可以显示三角形的两侧,但是我认为它通常启用可能是有原因的.. 例如速度..

Device->SetRenderState(D3DRS_CULLMODE, Value);

值可以等于

D3DCULL_NONE - Shows both sides of triangle
D3DCULL_CW - Culls Front side of triangle
D3DCULL_CCW - Default state
于 2012-06-24T07:47:00.937 回答