5

我正在尝试使用 OpenGL 3.x+ 为背景(2D)绘制一个四边形。不推荐使用四边形,因此目标是使用两个三角形来制作一个填充屏幕的矩形。它正在工作,但我对这里的所有内容都不是 100% 清楚。

  1. 设置

    GLuint positionBufferObject;
    GLfloat vertexPositions[] =
    {
        -1.0f, -1.0f, 0.0f, 1.0f,
        -1.0f,  1.0f, 0.0f, 1.0f,
         1.0f,  1.0f, 0.0f, 1.0f,
         1.0f, -1.0f, 0.0f, 1.0f,
        -1.0f, -1.0f, 0.0f, 1.0f,
    };
    glGenBuffers(1, &positionBufferObject);
    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);
    
    • 我理解vertexPositions,它是一个顶点数组。
    • glGenBuffers()是说,我想要 1 个缓冲区并将 id 分配给&positionBufferObject
    • glBufferData()上传vertexPositions到 GPU 的内存;但是由于我没有给它一个ID,它怎么知道要上传它?
  2. glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 5);
    glDisableVertexAttribArray(0);
    
    • glEnableVertexAttribArray()只是说我要用数组 0 绘图?
    • glDrawArrays()- 如果我想绘制两个顶点数组怎么办?它如何知道要渲染哪些?它从上面的命令中知道吗?
    • 不知道做什么glVertexAttribPointer()
    • glDrawArrays()清楚了。
  3. 清理一下,我觉得这样对吗?

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glDeleteBuffers(1, &positionBufferObject);
    

    我只进行一次设置/清理。

奖励积分:

  • 这是呈现这个的最有效方法吗?我读到我假设要提交并“批量”渲染[?],因为 3.x+ 不再执行即时模式。也只有一个数组,所以在这种情况下,批次对性能没有帮助,但是如果我说要绘制“非常大量”的 vertxArrays,它会是相同的过程吗?
  • 在设置中,他们将数组 id 存储为 positionBufferObject,但在渲染循环中对其进行了硬编码。似乎在十几个数组之后会变得混乱,为什么使用变量而不是硬编码它不是一个好习惯?
4

2 回答 2

9

glGenBuffers(1, &positionBufferObject);说“制作一个顶点缓冲区对象,并且positionBufferObject是它的 ID。”

glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);说“positionBufferObject现在是当前的GL_ARRAY_BUFFER。”

glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);说“上传vertexPositions到当前绑定的ID GL_ARRAY_BUFFER(即positionBufferObject)。”

glEnableVertexAttribArray(0);说“顶点属性数组 0 现在可以使用了。”

glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);说“顶点属性数组 0 将被解释为由 4 个浮点组组成。”

glDrawArrays(GL_TRIANGLE_STRIP, 0, 5);说“从每个启用的数组中绘制一个带有五个索引的三角形条带。”

glDisableVertexAttribArray(0);说“我们暂时完成了顶点属性数组0。”

于 2011-04-29T02:49:02.200 回答
4

在回答 user697111 关于多个数组的问题时,这很简单。

每个顶点属性都需要与一个缓冲区对象相关联。不是用 glVertexAttribPointer 指定缓冲区对象,而是通过 GL_ARRAY_BUFFER 完成关联。当您调用 glVertexAttribPointer(或任何 gl*Pointer 调用)时,当前绑定到 GL_ARRAY_BUFFER 的缓冲区将用作该属性的源。因此,请考虑以下事项:

glBindBuffer(GL_ARRAY_BUFFER, myPositionData);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, ..., 0);
glBindBuffer(GL_ARRAY_BUFFER, myColorData);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, ..., 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDrawArrays(...);

属性 0 将来自缓冲区对象myPositionData,属性 1 将来自缓冲区对象myColorData。我在调用之前取消了与 GL_ARRAY_BUFFER 的绑定这一事实glDrawArrays并没有改变这些属性的数据来​​自哪里。

于 2011-06-16T10:17:32.387 回答