我是Java OpenGL(JOGL)的新手。我想在JOGL中显示一个3D立方体。
我有顶点数组信息。
double vertices[]= {
0 0 0,
0 0 1,
0 1 0,
0 1 1,
1 0 0,
1 0 1,
1 1 0,
1 1 1,
};
我想使用glDrawArrays()
来显示它。因为我已经显示了一个具有大量顶点的模型。
显示方法如下:
public void display(GLAutoDrawable drawable) {
GL2 gl = drawable.getGL().getGL2();
gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glBegin(GL_TRIANGLE_STRIP);
gl.glEnd();
}
我只需使用GL_TRIANGLES
或GL_TRIANGLE_STRIP
和not GL_QUADS
。
如果有人知道如何在 JOGL中使用glDrawArrays();
,请帮助我。我想要JOGL语法而不是opengl。
答案 0 :(得分:1)
如果要使用glDrawArrays();
,则必须创建VBO(顶点缓冲区对象)或VA(顶点阵列)。如果您追求速度,那么选择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。
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并且不再需要它时,您可以通过执行以下操作将其删除。
glDeleteBuffers(vbo_vertex_handle);
glDeleteBuffers(vbo_color_handle);