我正在尝试使用OpenGL 3.x +绘制背景(2D)的四边形。四边形已弃用,因此我们的目标是使用两个三角形制作一个填充屏幕的矩形。它在工作,但我在这里的一切都不是100%清楚。了解使用三角形在OpenGL 3.3+核心中绘制四边形的代码
设置
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,但在渲染循环中对其进行了硬编码。似乎它会在十几个数组后出现混淆,为什么使用变量而不是硬编码是不好的做法呢?
而不是一个四边形,你可以使用一个三角形风扇,在只发送4个顶点的情况下,其行为几乎完全像四边形。您可以glPrimitiveRestartIndex将多个三角形风扇放入单个glDrawElements调用中。 – datenwolf 2011-04-29 07:53:56