OpenGL ES 2.0和动态VBO

时间:2014-12-27 01:04:48

标签: java android opengl-es vbo

我已经完成了现有的主题,并对自己进行了一些测试但是我不太确定我是以正确的方式做到这一点所以我宁愿问一个问题,而不是被困了几个小时才弄清楚自己我误解了使用多个OpenGL ES 2.0教程。

我已经实现了VBO,因为它们出现在'OpenGL ES 2 for Android - 快速入门指南'中,我想到了一个需要动态VBO的时刻,每个帧都需要通过一些矩阵计算进行更新(在模型顶点上,这可能是我错了。在完成这些计算之后,我想用这段Android / Java代码将那些已经分配的VBO(带glBufferData)转移(更新):

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, this.id);

    //GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, this.getLength() * Utils.BYTES_PER_FLOAT, null, GLES20.GL_DYNAMIC_DRAW);

    /* CREATE BUFFER AND SET POSITION */
    FloatBuffer fBuffer = ByteBuffer.allocateDirect((this.length = vertices.length) * Utils.BYTES_PER_FLOAT)
            .order(ByteOrder.nativeOrder()).asFloatBuffer().put(vertices);
    fBuffer.position(0);

    GLES20.glBufferSubData(GLES20.GL_ARRAY_BUFFER, 0, fBuffer.capacity(), fBuffer);

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
  • this.id - 以前生成的缓冲区的ID
  • this.getLength - 最初分配的FloatBuffer长度

正如你所注意到的那样,我已经注释掉了其他问题中提到的那条线,仅仅是因为屏幕上的闪烁对象让我无法正确理解。这样做的一切都运行得很好但我在应用程序运行期间注意到了一些GC_FOR_ALLOC,这确保了它可能不是一段有效的代码。

问题 - 或多或少 - 是:

  • 这是更新此类缓冲区的有效方法,还是我可以根据我提供的情况(OpenGL ES 2.0,Android 4+)正确地获取建议?

一个子问题是:

  • 在这些情况下,使用VBO进行动态模型的方法比使用VAO更好吗?或者我应该为静态和VAO实现动态的VBO方法?
  • 我应该何时开始担心只关注GC_FOR_ALLOC调试信息的内存问题?
  • (在主题子问题之外一点)使用正等距视图矩阵(正交+ 2x旋转+ Z-平移)什么是为应用程序创建GUI的适当方法?

编辑(27.12):

要实现等轴投影矩阵,我只需使用以下几行:

    Matrix.orthoM(this.orthoProjectionMatrix, 0, -screenAspect, screenAspect, -1.0f, 1.0f, -1.0f, 10.0f);
    Matrix.translateM(this.viewProjectionMatrix, 0, this.orthoProjectionMatrix, 0, 0.0f, 0.0f, -5.0f);
    Matrix.rotateM(this.viewProjectionMatrix, 0, 45, 1.0f, 0.0f, 0.0f);
    Matrix.rotateM(this.viewProjectionMatrix, 0, 45, 0.0f, 1.0f, 0.0f);

这很简单:

  • 根据屏幕方面创建正交投影,
  • 仅在Z轴上移动(因此场景从远处可见)
  • 将X轴旋转45度
  • 将Y轴旋转45度

有些元素被放在一起,所以请不要考虑到一些翻译是就地的,有些是将结果与另一个矩阵结合在一起。

1 个答案:

答案 0 :(得分:3)

(前言:我不熟悉OpenGL ES,只是使用普通的OpenGL。但是,我无法想象API差异太大了)

  

是否是更新此类缓冲区的有效方法

除非fBuffer始终小于或等于OpenGL缓冲区的大小。 glBufferSubData不会调整缓冲区大小,并且不允许写入分配范围之外。您可以使用glBufferData将缓冲区重新分配到新大小。另请查看buffer object streaming

  

对于动态模型而言,使用VBO比使用VAO更好地处理这些情况,还是应该为静态和VAO实现动态的VBO方法?

VBOs和VAO是正交概念。 VBO存储顶点数据; VAO只是指定渲染顶点的位置和方式。

  

使用正等距视图矩阵(正交+ 2x旋转+ Z平移)为应用程序创建GUI的适当方法是什么?

删除Z转换,而是在禁用深度缓冲区的情况下最后渲染GUI。还有什么轮换?