当前位置: 首页 > 知识库问答 >
问题:

显示列表和VBO OpenGL/LWJGL

郎灿
2023-03-14

我最近发现了如何使用LWJGL和OpenGL渲染3D立方体,我非常激动,我渲染了2000个立方体,并有效地冻结了我的计算机。我听说过诸如显示列表和VBO之类的东西,但即使在谷歌搜索之后,我也不知道如何使用它们。

目前,我有

for (Block b : blocks) {
    GL11.glTranslatef(b.position.x, b.position.y, b.position.z); // Translate to draw the cube.
    GL11.glBegin(GL_QUADS); // Start to draw the quad.
    b.render(); // Renders the quad.
    GL11.glEnd(); // Finishes rendering.
}

渲染我的立方体。调用b.render只是渲染一个立方体

@Override
public void render() {
    //front face
    GL11.glNormal3f(0f, 0f, 1f);
    GL11.glTexCoord2f(0f, 1f);
    GL11.glVertex3f(1f, 0f, 0f);
    GL11.glTexCoord2f(1f, 1f);
    GL11.glVertex3f(0f, 0f, 0f);
    GL11.glTexCoord2f(1f, 0f);
    GL11.glVertex3f(0f, 1f, 0f);
    GL11.glTexCoord2f(0f, 0f);
    GL11.glVertex3f(1f, 1f, 0f);

    //back face
    GL11.glNormal3f(0f, 0f, -1f);
    GL11.glTexCoord2f(0f, 1f);
    GL11.glVertex3f(0f, 0f, 1f);
    GL11.glTexCoord2f(1f, 1f);
    GL11.glVertex3f(1f, 0f, 1f);
    GL11.glTexCoord2f(1f, 0f);
    GL11.glVertex3f(1f, 1f, 1f);
    GL11.glTexCoord2f(0f, 0f);
    GL11.glVertex3f(0f, 1f, 1f);

    cap.bind(); // top texture
    //top face
    GL11.glNormal3f(0f, -1f, 0f);
    GL11.glTexCoord2f(0f, 1f);
    GL11.glVertex3f(1f, 1f, 0f);
    GL11.glTexCoord2f(1f, 1f);
    GL11.glVertex3f(0f, 1f, 0f);
    GL11.glTexCoord2f(1f, 0f);
    GL11.glVertex3f(0f, 1f, 1f);
    GL11.glTexCoord2f(0f, 0f);
    GL11.glVertex3f(1f, 1f, 1f);

    //bottom face
    GL11.glNormal3f(0f, 1f, 0f);
    GL11.glTexCoord2f(0f, 1f);
    GL11.glVertex3f(1f, 0f, 1f);
    GL11.glTexCoord2f(1f, 1f);
    GL11.glVertex3f(0f, 0f, 1f);
    GL11.glTexCoord2f(1f, 0f);
    GL11.glVertex3f(0f, 0f, 0f);
    GL11.glTexCoord2f(0f, 0f);
    GL11.glVertex3f(1f, 0f, 0f);

    side.bind(); // left texture
    //left face
    GL11.glNormal3f(-1f, 0f, 0f);
    GL11.glTexCoord2f(0f, 1f);
    GL11.glVertex3f(1f, 0f, 1f);
    GL11.glTexCoord2f(1f, 1f);
    GL11.glVertex3f(1f, 0f, 0f);
    GL11.glTexCoord2f(1f, 0f);
    GL11.glVertex3f(1f, 1f, 0f);
    GL11.glTexCoord2f(0f, 0f);
    GL11.glVertex3f(1f, 1f, 1f);

    //right face
    GL11.glNormal3f(1f, 0f, 0f);
    GL11.glTexCoord2f(0f, 1f);
    GL11.glVertex3f(0f, 0f, 0f);
    GL11.glTexCoord2f(1f, 1f);
    GL11.glVertex3f(0f, 0f, 1f);
    GL11.glTexCoord2f(1f, 0f);
    GL11.glVertex3f(0f, 1f, 1f);
    GL11.glTexCoord2f(0f, 0f);
    GL11.glVertex3f(0f, 1f, 0f);
}

其中cap是顶部纹理,side是侧面纹理。

我真正需要的帮助是弄清楚如何使我的代码VBO和/或显示列表兼容,以提高性能。我还认为,如果可以只渲染可见的面孔,它将节省许多计算,但不知道如何做这样的事情。

编辑:

我现在让每个块通过以下代码创建自己的VBO对象。。。

private int vboID;
private FloatBuffer vertices;
private float[] verts = {0, 1, 2, 2, 3, 0, 0, 3, 4, 4, 5, 0, 0, 5, 6, 6, 1, 0, 1, 6, 7, 7, 2, 1, 7, 4, 3, 3, 2, 7, 4, 7, 6, 6, 5, 4}; // Not sure on the numbers for making a cube?

private void generateVBO() {
    vertices = BufferUtils.createFloatBuffer(verts.length); // Create a FloatBuffer...
    vertices.put(verts); // Add all the vertices in...
    vboID = GL15.glGenBuffers(); // Generate the VBO...
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vboID); // Bind it...
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertices, GL15.GL_STATIC_DRAW); // Buffer in the data...
    verts = null; // Free up memory allocation because these are unnecessary now...
    vertices = null;
    System.out.println("VBO created with a vboID of '"+vboID+"'.");
}

在我的程序开始时,我创建了1000个块对象,因此我的输出是有效的“VBO创建,vboID为n”,1000次。

我知道在程序结束时,我需要处理VBO(我假设我只是为每个VBO调用GL15.glBindBuffer(GL15.GL\u ARRAY\u BUFFER,0))但首先,我需要绘制每个VBO。

绘制VBOs的命令是什么?

共有1个答案

陈斌
2023-03-14

请不要使用显示列表,它们已过时且不推荐使用。有效地使用VBOs需要使用顶点数组。使用顶点数组时,将所有顶点位置和其他属性放入数组中,然后使用对glDrawArrays(假定数组只是一长串要逐个处理的顶点)或GLDRAWEREMENT的单个调用批处理大量三角形的绘制(采用附加数组,该数组包含引用顶点数组中元素的索引列表)。

以下是有关顶点阵列的教程:

http://www.songho.ca/opengl/gl_vertexarray.html

一旦顶点数组开始工作,这对VBOs来说只是一小步。

 类似资料:
  • 我使用带thymeleaf 3的Spring靴 我试着展示一个豆子 在我的控制器里我有 在我的车里 在我的位置 在我的胸腺碎片中 当我试图显示这个片段时,我得到 org.attoparser。ParseException:异常评估SpringEL表达式:“cities.id”由:org.springframework.expression.spel引起。SpelEvaluationExceptio

  • 我有一个应用程序,在JSP页面中,我显示一个下拉列表,但我的代码中有一个例外。 控制器类别:- addDetails.jsp·佩奇 我得到了以下异常:- 它只是一个Spring MVC Web应用程序,我试图在其中显示预先填充了颜色数据的卓尔向下列表。 非常感谢任何帮助。

  • mysqlshow客户可用来很快地查找存在哪些数据库,数据库中的表,表中的列或索引。 mysqlshow为一些SQL显示语句提供了一个命令行界面。相同的信息可以通过直接使用那些语句获得。例如,你可以从mysql客户程序发出它们。参见13.5.4节,“SHOW语法”。 象这样调用mysqlshow: shell> mysqlshow[选项] [db_name [tbl_name [col_name]

  • 我试图显示存储在mongodb数据库中的lat和lng的标记列表。我正在使用google-maps-react,这是我的子地图组件 我从这里的endpoint得到坐标 仍未显示

  • 英文原文:http://emberjs.com/guides/templates/displaying-a-list-of-items/ 如果你需要枚举一个对象列表,可以使用Handlebar的{{#each}}助手: 1 2 3 4 5 <ul> {{#each people}} <li>Hello, {{name}}!</li> {{/each}} </ul> 对于数组中的

  • 问题内容: 我正在尝试建立我的第一个响应式布局。我想以垂直线显示列表项,具体取决于宽度。 如果浏览器调整大小,我希望它成为 有人能帮我吗?我已经尝试了几个小时,却什么也没得到。我试过使用表,但我也不能那样做。 问题答案: 使用 CSS3 列可以很容易地做到这一点。这是一个示例,HTML: