【问题标题】:Drawing many textured particles quickly in OpenGL ES 1.1在 OpenGL ES 1.1 中快速绘制许多纹理粒子
【发布时间】:2010-12-10 01:09:42
【问题描述】:

我正在尝试使用 OpenGL 在 Android 中渲染一些粒子效果。每个粒子都将是一个广告牌纹理四边形,并且每个粒子都通过旋转(即围绕 z 轴)进行渲染。我仅限于使用 OpenGL ES 1.1,所以点精灵和像素着色器不是一个选项。有什么方法可以快速渲染和更新许多粒子(例如 100 到 5000)的位置?

我知道对每个粒子使用 OpenGL 绘制调用会非常慢,但是当我需要在每帧更新我的粒子位置时,我对如何使用 VBO 之类的东西感到困惑。

【问题讨论】:

  • 小心 VBO - 许多手机,即使是最初的 Droid,也不一定支持它们。
  • 真的吗?我现在正在里程碑上使用 VBO。我认为 OpenGL 1.1 支持需要 VBO?如果您有很多动态对象而没有 VBO,那么获得快速 OpenGL 性能是不是几乎不可能?
  • 看看这个问题:stackoverflow.com/questions/2093594/…。 Droid 没有列出 GL_ARB_vertex_buffer_object。有趣的是 Lance Nanek 的回答,他指出这似乎是能力报告中的一个问题,因为 Droid 应该有 VBO(您刚刚确认)。
  • 我不久前读过这篇文章,并假设解决方案是在(“报告 OpenGL 1.1 支持”||“OpenGL 报告 GL_ARB_vertex_buffer_object 扩展可用”)为真时期待 VBO。这是正确的吗?

标签: android opengl-es


【解决方案1】:

随机的想法。可能会或可能不会很好地工作。使用一次绘制调用,或至少将粒子一起分批成组(例如,每组 32 个)。您可以在 CPU 上每帧构造每个组,然后将其发送下来。只需使用 GL_TRIANGLE_FAN 构造一个大数组(通过两次添加相同的顶点,IIRC 你是一个“终止”风扇)。

我认为,其中一个挑战是创建这个缓冲区。这是Java还是JNI?你在使用 java.nio 缓冲区吗?根据我在论坛中看到的内容,在 Java 中修改这些缓冲区可能非常缓慢。 (顺便说一句 - 我对 Android 上的内部缓冲区处理不太熟悉,您可能需要也可能不需要对它们进行双重缓冲。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 2019-11-16
    相关资源
    最近更新 更多