我正在尝试使用 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);
我只进行一次设置/清理。
奖励积分:
- 这是呈现这个的最有效方法吗?我读到我假设要提交并“批量”渲染[?],因为 3.x+ 不再执行即时模式。也只有一个数组,所以在这种情况下,批次对性能没有帮助,但是如果我说要绘制“非常大量”的 vertxArrays,它会是相同的过程吗?
- 在设置中,他们将数组 id 存储为 positionBufferObject,但在渲染循环中对其进行了硬编码。似乎在十几个数组之后会变得混乱,为什么使用变量而不是硬编码它不是一个好习惯?