Java 如何使用GLDrawArray在JOGL中显示多维数据集

Java 如何使用GLDrawArray在JOGL中显示多维数据集,java,opengl,jogl,Java,Opengl,Jogl,我是Java OpenGL(JOGL)新手。我想在JOGL中显示三维立方体 我随身携带顶点数组信息 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

我是Java OpenGL(JOGL)新手。我想在JOGL中显示三维立方体

我随身携带顶点数组信息

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\u三角形
GL\u三角形条
,而
不需要使用GL\u四边形


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

如果您想使用
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);
当然,如果愿意,您可以向
顶点数据
颜色数据
添加更多顶点和颜色!但始终记住,顶点数据的数量,需要与颜色数据的数量相匹配,反之亦然

重要提示:仅创建一次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);

如果要使用
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);
当然,如果愿意,您可以向
顶点数据
颜色数据
添加更多顶点和颜色!但始终记住,顶点数据的数量,需要与颜色数据的数量相匹配,反之亦然

重要提示:仅创建一次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);
你说“我想要JOGL语法而不是opengl”是什么意思?你说“我想要JOGL语法而不是opengl”是什么意思?