如果要使用,glDrawArrays();
则必须创建 VBO(顶点缓冲区对象)或 VA(顶点数组)。如果您追求速度,请选择 VBO,尽管它们需要编写一些额外的代码行!
我认为我可以向您解释如何创建 VBO 的最佳方式是给您一个示例!
VBO 示例
这是一个 VBO 存储三角形的顶点和颜色并渲染它以及如何删除它的小例子!
创建 VBO
这是您创建实际顶点和颜色缓冲区并将它们绑定到 VBO 的代码。
int vertices = 3;
int vertex_size = 3; // X, Y, Z,
int color_size = 3; // R, G, B,
FloatBuffer vertex_data = BufferUtils.createFloatBuffer(vertices * vertex_size);
vertex_data.put(new float[] { -1f, -1f, 0f, });
vertex_data.put(new float[] { 1f, -1f, 0f, });
vertex_data.put(new float[] { 1f, 1f, 0f, });
vertex_data.flip();
FloatBuffer color_data = BufferUtils.createFloatBuffer(vertices * color_size);
color_data.put(new float[] { 1f, 0f, 0f, });
color_data.put(new float[] { 0f, 1f, 0f, });
color_data.put(new float[] { 0f, 0f, 1f, });
color_data.flip();
int vbo_vertex_handle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex_handle);
glBufferData(GL_ARRAY_BUFFER, vertex_data, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
int vbo_color_handle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo_color_handle);
glBufferData(GL_ARRAY_BUFFER, color_data, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
vertex_data
当然,color_data
如果你愿意,你可以添加更多的顶点和颜色!但永远记住,顶点数据量,需要与颜色数据量相匹配,反之亦然!
重要提示:仅创建一次 VBO,并且仅在必要时更新它们!不要为每一帧都创建它们,因为它们最终的帧速率会比使用立即模式进行渲染时更差!
渲染 VBO
这是您需要调用的代码,以呈现 VBO。
glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex_handle);
glVertexPointer(vertex_size, GL_FLOAT, 0, 0l);
glBindBuffer(GL_ARRAY_BUFFER, vbo_color_handle);
glColorPointer(color_size, GL_FLOAT, 0, 0l);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, vertices);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
删除 VBO
然后,当您完成 VBO 并且不再需要它时,您可以通过执行以下操作将其删除。
glDeleteBuffers(vbo_vertex_handle);
glDeleteBuffers(vbo_color_handle);