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

时间:2011-04-29 02:14:57

标签: c++ c opengl opengl-3

我正在尝试使用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);
    

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

  4. 奖励积分:

    • 这是最有效的渲染方法吗?我读到我认为提交并以“批量”[?]呈现,因为3.x +不再立即执行模式。也只有一个数组,所以批次在这种情况下不会有帮助,但是如果我说“非常大量”的vertxArrays要绘制,那么它会是同一个过程吗?
    • 在设置中,它们将数组id存储为positionBufferObject,但在渲染循环中对其进行了硬编码。似乎在十几个阵列之后会让人感到困惑,为什么使用变量代替硬编码不是很好的做法呢?

2 个答案:

答案 0 :(得分:7)

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的ID(positionBufferObject)。”

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

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

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

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

答案 1 :(得分:3)

在回答user697111关于多个数组的问题时,它非常简单。

每个顶点属性都需要与缓冲区对象相关联。不是使用glVertexAttribPointer指定缓冲区对象,而是通过GL_ARRAY_BUFFER完成关联。当您调用glVertexAttribPointer(或任何gl *指针调用)时,当前绑定到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的绑定这一事实并没有改变这些属性的数据来​​自何处。