我正在尝试使用OpenGL 3.x +为背景(2D)绘制四边形。不推荐使用四边形,因此目标是使用两个三角形来制作填充屏幕的矩形。这是有效的,但我不是100%清楚这里的一切。
设置
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,它怎么知道上传呢? 绘图
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 5);
glDisableVertexAttribArray(0);
glEnableVertexAttribArray()
只是说我要用数组0绘图?glDrawArrays()
- 如果我想绘制两个顶点数组怎么办?它是如何知道要渲染的?它知道从上面的命令?glVertexAttribPointer()
是做什么的?glDrawArrays()
很清楚。清理,我认为这是对的吗?
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDeleteBuffers(1, &positionBufferObject);
我只进行一次设置/清理。
奖励积分:
答案 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的绑定这一事实并没有改变这些属性的数据来自何处。