Java - 如何在LWJGL中使用顶点缓冲区对象?

jul*_*ian 0 java opengl lwjgl slick2d

我正在尝试使用顶点缓冲区对象.

起初,在我遇到这种令人讨厌的情况之前没有任何问题:

glPointSize(2.0f);
glBegin(GL_POINTS);
for (Entity p : points) {
    glVertex3f(p.x, p.y, p.z);
}
glEnd();
Run Code Online (Sandbox Code Playgroud)

如何将其转换为Vertex缓冲区对象渲染?

我的意思是,你可以看到,数据(x,y,z)每次都为每个点改变(它是一个循环).

那么我如何实现Vertex缓冲区对象渲染呢?

Val*_*tin 8

基本上你想要它将所有顶点数据放入a FloatBuffer,然后将其传递给OpenGL.我创建了一个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);
Run Code Online (Sandbox Code Playgroud)

您当然可以添加更多顶点和颜色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);
Run Code Online (Sandbox Code Playgroud)

删除VBO

然后,当您完成VBO并且不再需要它时,可以通过执行以下操作将其删除.

glDeleteBuffers(vbo_vertex_handle);
glDeleteBuffers(vbo_color_handle);
Run Code Online (Sandbox Code Playgroud)