我正在使用带有 VBO 的 glDrawElements 调用来渲染我的场景。场景是一块带有顶点和纹理坐标的布料——在这个例子中,我正在渲染一个标志。
在我的场景中,顶点是动态的,这意味着我需要每帧都写入 VBO。我的大部分处理都是使用 CUDA 在 GPU 上完成的,所以我不断地将 CPU 内存映射到 GPU 内存。另一方面,纹理坐标是静态的。为了使用 glDrawElements 进行渲染(据我了解),我应该在顶点 VBO 中交错纹理坐标,然后简单地调用 glTexCoordPointer() 和 glEnableClientState()。这不是最优的,因为当我进行 CPU<-->GPU 内存映射时,我需要与我一起绘制所有纹理坐标。
有没有办法安排我的 vbo 以便我可以更新 vbo 中的顶点数据而不接触 vbo 中的纹理数据?下面是我的渲染代码——我目前填充了三个数组:一个索引数组、一个顶点数组和一个纹理数组。
在下面的代码中,indexVbo 已映射到索引数组,而 vbo 已映射到顶点数组。我现在需要合并纹理。任何见解或建议将不胜感激。
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, flagTexId);
glPushMatrix();
glColor3f(1.0, 1.0, 1.0);
glVertexPointer(4, GL_FLOAT, 0, 0);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVbo);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
// Render flag mesh
glDrawElements(GL_TRIANGLES, numTriangles * 3, GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glPopMatrix();
glDisable(GL_TEXTURE_2D);