0

我正在尝试制作一个 OpenGLES 2.0 立方体应用程序。想法是将纹理(alpha 75%)应用于立方体的所有 6 个面。这意味着即使我旋转立方体,我也能够在任何给定帧上看到所有 6 个面。现在我启用了深度测试(我的应用需要这个!!)和混合。深度函数是 LEQUAL,混合函数是 SRC_ALPHA、ONE_MINUS_SRC_ALPHA。

现在,问题是在某些立方体面不显示底层面。我无法理解这一点,因为逻辑适用于其他立方体面。只是为了记录,我禁用了 CULL_FACE。

提前致谢。

问候,

益智游戏

4

1 回答 1

2

面是按照定义的顺序绘制的。现在随着立方体的旋转,它们的绘制顺序不会改变。有些人脸首先靠近相机。然后在此之后绘制一些面部,但 Z-test 表明已经有一个像素更靠近相机,因此不需要进行绘制。

这里的问题是 OpenGL|ES 2.0 在渲染面时不会对面进行排序。正确处理透明度和深度仍然是 3D 编程中的一个真正挑战,但对于这种简单的情况,您可以将面从后到前排序。回到前面称为“画家算法”,排序称为“深度排序”或“z 排序”。

简单的,绝对不是最好的,肯定是低效的方式可能会像这样工作:

  1. 通过计算三个顶点的平均值来计算人脸的中心顶点
  2. 通过相机(视图+投影)和可能的模型矩阵将它们投影到屏幕空间
  3. 通过某种排序算法对它们的 Z 值进行排序
  4. 按此顺序构建具有顶点的顶点缓冲区,或者仅以新顺序重写索引缓冲区(如果顶点未更改,则要移动的东西更少)
  5. 像往常一样渲染立方体

有更好的方法来处理这个问题,并且有各种各样的高级优化。但我没有找到任何教程来涵盖这样的简单案例。也许我只是没有找到正确的关键字。

于 2010-06-09T09:48:58.543 回答