理解在OpenGL 3.3+内核中使用三角形绘制四边形的代码
Understanding code used to draw quads in OpenGL 3.3+ core using triangles
我试图使用OpenGL 3.x+为背景(2D)绘制一个四边形。四边形已被弃用,所以我们的目标是使用两个三角形构成一个填充屏幕的矩形。它起作用了,但我不是百分百清楚。
-
设置
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()
说,我想要一个缓冲区并将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()
是clear.
-
-
清理一下,我想这是对的吗?
glBindBuffer(GL_ARRAY_BUFFER, 0); glDeleteBuffers(1, &positionBufferObject);
我只做一次设置/清理。
加分:
- 这是最有效的方式来渲染这个?我读到我应该提交和渲染"批量"[?][au:自从;X +不再执行直接模式。也只有一个数组,所以批处理在这种情况下不会帮助性能,但如果我说"非常多"的vertxArrays来绘制,它会是相同的过程吗?
- 在设置中,他们将数组id存储为positionBufferObject,但在渲染循环中硬编码。似乎在十几个数组之后会变得混乱,为什么使用变量而不是硬编码它不是一个好的实践?
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。"
回答user697111关于多个数组的问题,这很简单。
每个顶点属性需要与一个缓冲区对象相关联。不是用glVertexAttribPointer指定缓冲区对象,而是通过GL_ARRAY_BUFFER完成关联。当你调用glVertexAttribPointer(或任何gl*Pointer调用),当前绑定到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的绑定,这一事实并没有改变这些属性的数据来自何处。
- 绘制旋转的三角形
- 绘制顺时针三角形,重新排序点
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 是否可以使用 DirectX 3D 11 绘制由三角形组成的圆?
- OpenGL绘制三角形而不是正方形
- 在 OpenGL 中使用三角形绘制字母?
- 为什么这个在 opengl 中绘制三角形的着色器没有多次运行
- 使用 glDrawArray 函数绘制三角形
- 三角形未绘制.C++/GLEW/SDL.
- GLFW程序不绘制三角形
- OpenGL不会绘制三角形,遵循确切的格式
- 使用 C++ 库 GLEW 在 openGl 中绘制一个红色三角形
- 用OpenGL绘制三角形
- 绘制三角形时只有空白屏幕
- OpenGL绘制三角形只有白色
- 使用 OpenGL 绘制基本三角形
- 计算机图形:我自己绘制三角形
- 如何使用OSG API在Osgearth上绘制三角形
- 理解在OpenGL 3.3+内核中使用三角形绘制四边形的代码
- OpenGL:使用退化三角形绘制线条