【问题标题】:How to use glDrawArrays to display cube in JOGL如何使用 glDrawArrays 在 JOGL 中显示立方体
【发布时间】:2013-10-13 23:34:17
【问题描述】:

我是 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_TRIANGLESGL_TRIANGLE_STRIPnot GL_QUADS

如果有人知道如何在 JOGL 中使用glDrawArrays();,请帮助我。我想要 JOGL 语法而不是 opengl。

【问题讨论】:

  • “我想要 JOGL 语法而不是 opengl”是什么意思。 ?

标签: java opengl jogl


【解决方案1】:

如果您想使用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_datacolor_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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2016-07-08
    • 1970-01-01
    相关资源
    最近更新 更多