【问题标题】: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-排序”。

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

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

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

    【讨论】:

    • 感谢您的回复。会试试这个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    相关资源
    最近更新 更多