我已经了解了现有的主题并自己进行了一些测试,但我不太确定我是否以正确的方式进行了测试,所以我宁愿问一个问题,也不愿被困在更长时间里弄清楚自己我在使用多个 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/