我已经完成了现有的主题,并对自己进行了一些测试但是我不太确定我是以正确的方式做到这一点所以我宁愿问一个问题,而不是被困了几个小时才弄清楚自己我误解了使用多个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);
正如你所注意到的那样,我已经注释掉了其他问题中提到的那条线,仅仅是因为屏幕上的闪烁对象让我无法正确理解。这样做的一切都运行得很好但我在应用程序运行期间注意到了一些GC_FOR_ALLOC,这确保了它可能不是一段有效的代码。
问题 - 或多或少 - 是:
一个子问题是:
编辑(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);
这很简单:
有些元素被放在一起,所以请不要考虑到一些翻译是就地的,有些是将结果与另一个矩阵结合在一起。
答案 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。还有什么轮换?