【问题标题】:OpenGLES iPhone Depth Blending problemOpenGLES iPhone深度混合问题
【发布时间】:2023-03-10 18:48:02
【问题描述】:
我正在尝试制作一个 OpenGLES 2.0 立方体应用程序。
想法是将纹理(alpha 75%)应用于立方体的所有 6 个面。
这意味着即使我旋转立方体,我也能够在任何给定帧上看到所有 6 个面。现在我启用了深度测试(我的应用需要这个!!)和混合。深度函数是 LEQUAL,混合函数是 SRC_ALPHA、ONE_MINUS_SRC_ALPHA。
现在,问题是在某些立方体面不显示底层面。我无法理解这一点,因为逻辑适用于其他立方体面。仅作记录,我已禁用 CULL_FACE。
提前致谢。
问候,
谜题
【问题讨论】:
标签:
iphone
opengl-es
blend
depth
【解决方案1】:
按定义的顺序绘制面。现在随着立方体的旋转,它们的绘制顺序不会改变。有些人脸首先靠近相机。然后再画一些人脸,但是 Z-test 说已经有一个像素离相机更近了,所以不需要再画了。
这里的问题是 OpenGL|ES 2.0 在渲染面时不会对面进行排序。正确处理透明度和深度仍然是 3D 编程中的一个真正挑战,但对于这种简单的情况,您可以将面从后向前排序。往前画称为“画家算法”,排序称为“深度排序”或“z-排序”。
简单,绝对不是最好的,肯定是低效的方式可能会像这样工作:
- 计算面的中心顶点
通过计算三个的平均值
顶点
- 通过相机(视图+投影)和可能的模型矩阵将它们转换到屏幕空间
- 通过某种排序算法对其 Z 值进行排序
- 按此顺序使用顶点构建顶点缓冲区,或者仅以新顺序重写索引缓冲区(如果顶点未更改,则移动的东西更少)
- 照常渲染立方体
有更好的方法来处理这个问题,还有各种高级优化。但我没有找到任何教程来涵盖这样的简单案例。也许我只是没有找到正确的关键字。