2011-04-29 38 views
3

我正在尝试使用OpenGL 3.x +绘制背景(2D)的四边形。四边形已弃用,因此我们的目标是使用两个三角形制作一个填充屏幕的矩形。它在工作,但我在这里的一切都不是100%清楚。了解使用三角形在OpenGL 3.3+核心中绘制四边形的代码

  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,但在渲染循环中对其进行了硬编码。似乎它会在十几个数组后出现混淆,为什么使用变量而不是硬编码是不好的做法呢?
+0

而不是一个四边形,你可以使用一个三角形风扇,在只发送4个顶点的情况下,其行为几乎完全像四边形。您可以glPrimitiveRestartIndex将多个三角形风扇放入单个glDrawElements调用中。 – datenwolf 2011-04-29 07:53:56

回答

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(这是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

谢谢。 1)你如何处理多个GL_ARRAY_BUFFER? 2)glVertexAttribPointer基本上是说“如何”使用数组及其格式? – user697111 2011-04-29 02:52:41

+1

1)我不是一个足够专家来回答这个问题:) 2)是的;例如,如果您的位置和颜色是交错的,而不是处于不同的连续块中,则您的“glVertexAttribPointer”调用将会有所不同。 3)在每次显示更新时调用它。 – dfan 2011-04-29 02:56:04

+1

@ user697111对于1)glDrawArrays将使用任何一个VBO当前绑定,所以如果你想从第二个VBO绘制,只需调用glBindBuffer与第二个VBO的ID并再次调用glDrawArrays。 – 2011-04-29 05:09:38

3

在回答user697111的有关多个阵列的问题,“我们正在与顶点属性阵列0时正在做”,这是相当简单的。

每个顶点属性都需要与一个缓冲区对象关联。而不是用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的事实,这些属性的数据来​​自哪里。