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

use*_*111 3 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);
    
    Run Code Online (Sandbox Code Playgroud)
    • 我明白了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);
    
    Run Code Online (Sandbox Code Playgroud)
    • glEnableVertexAttribArray() 只是说我要用数组0绘图?
    • glDrawArrays() - 如果我想绘制两个顶点数组怎么办?它是如何知道要渲染的?它知道从上面的命令?
    • 不确定是什么glVertexAttribPointer()
    • glDrawArrays() 清楚了.
  3. 清理,我觉得这是对的吗?

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glDeleteBuffers(1, &positionBufferObject);
    
    Run Code Online (Sandbox Code Playgroud)

    我只进行一次安装/清理.

奖励积分:

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

dfa*_*fan 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到当前绑定的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".