基本的に、すべての頂点データを に入れ、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);
vertex_data
もちろん、必要に応じてさらに頂点と色を追加することもできcolor_data
ます! ただし、頂点データの量はカラー データの量と一致する必要があり、その逆も同様であることに注意してください。
重要: VBO は 1 回だけ作成し、必要な場合にのみ更新してください。フレームごとに作成しないでください。レンダリングに即時モードを使用する場合よりもフレームレートが低下するためです。
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);