理解在OpenGL 3.3+内核中使用三角形绘制四边形的代码

Understanding code used to draw quads in OpenGL 3.3+ core using triangles

本文关键字:三角形 绘制 四边形 代码 OpenGL 内核      更新时间:2023-10-16

我试图使用OpenGL 3.x+为背景(2D)绘制一个四边形。四边形已被弃用,所以我们的目标是使用两个三角形构成一个填充屏幕的矩形。它起作用了,但我不是百分百清楚。

  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()说,我想要一个缓冲区并将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()是clear.
  3. 清理一下,我想这是对的吗?

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

    我只做一次设置/清理。

加分:

  • 这是最有效的方式来渲染这个?我读到我应该提交和渲染"批量"[?][au:自从;X +不再执行直接模式。也只有一个数组,所以批处理在这种情况下不会帮助性能,但如果我说"非常多"的vertxArrays来绘制,它会是相同的过程吗?
  • 在设置中,他们将数组id存储为positionBufferObject,但在渲染循环中硬编码。似乎在十几个数组之后会变得混乱,为什么使用变量而不是硬编码它不是一个好的实践?

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到当前绑定到GL_ARRAY_BUFFER(即positionBufferObject)的ID。"

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

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

glDrawArrays(GL_TRIANGLE_STRIP, 0, 5);表示"从每个启用的数组中绘制一个具有五个索引的三角形带。"

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

回答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。我在调用glDrawArrays之前解除了对GL_ARRAY_BUFFER的绑定,这一事实并没有改变这些属性的数据来自何处。