java - OpenGL ES 2.0 和动态 VBO

标签 java android opengl-es vbo

我已经了解了现有的主题并自己进行了一些测试,但我不太确定我是否以正确的方式进行了测试,所以我宁愿问一个问题,也不愿被困在更长时间里弄清楚自己我在使用多个 OpenGL ES 2.0 教程时误解了什么。

我已经实现了 VBO,正如它们在“Android 版 OpenGL ES 2 - 快速入门指南”中所介绍的那样,现在我需要一个动态 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 更好,还是我应该为静态实现 VBO 方法,为动态实现 VAO?
  • 我什么时候应该开始担心内存问题,只需查看 GC_FOR_ALLOC 调试信息?
  • (有点超出主题子问题)使用正交等距 View 矩阵(正交 + 2 倍旋转 + 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 度

有些元素是放在一起的,所以请不要考虑这样的事实,有些翻译是就地的,有些是与另一个矩阵的结果。

最佳答案

(前言:我对 OpenGL ES 不熟悉,只熟悉常规 OpenGL。但是,我无法想象 API 差异太大)

Is it a valid approach to updating such buffer

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

Is approach using VBO for dynamic models better than using VAO for these circumstances or should I rather implement a VBO approach for statics and VAO for dynamics?

VBO 和 VAO 是正交的概念。 VBO 存储顶点数据; VAO 仅指定在何处以及如何获取顶点进行渲染。

Using ortho-isometric view matrix (orthographic + 2x rotations + Z-translation) what is an appropriate approach to create a GUI for an application ?

放弃 Z 平移,而是在禁用深度缓冲区的情况下最后渲染 GUI。另外,旋转的目的是什么?

关于java - OpenGL ES 2.0 和动态 VBO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27663505/

相关文章:

Android 禁用命令进程的 logcat I/System

java - j2me和ksoap如何获取asp.net webservice中的特定元素

ios - Cocos2dx 在不使用 plist 文件的情况下更改 Sprite 大小和纹理 uv

iphone - opengl es中的闪电效果

java - CWE-681 : Avoid numerical data corruption during incompatible mutation in Java

java - 在 Struts2 中使用流结果

java - 有什么方法可以下载 Mediafire 链接吗?

android - recyclerview 没有附加适配器;跳过布局

java - 循环读取字符

ios - NSString 绘制矩形 : and drop shadows on iOS