我有一个顶点缓冲区对象 (VBO),我通常使用它(使用适当的 VAO)通过两次调用glDrawArrays
(一个使用 GL_POINTS,一个使用 GL_LINE_STRIP)在它们之间绘制带有线的点。
现在我有兴趣放弃 GL_LINE_STRIP 并通过定义索引缓冲区对象 (IBO) 并使用glDrawElements
.
但是,当我创建一个 VBO 然后创建并填充 IBO 时,我的调用glDrawArrays(GL_POINTS,...)
什么也没做!如果我简单地注释掉调用的行,调用就会glBufferData(GL_ELEMENT_ARRAY_BUFFER,...)
再次glDrawArrays
起作用。我认为添加 IBO 会被调用忽略glDrawArrays
,但显然不是。
那么,是否可以使用一个 VBO 来使用 aglDrawArrays
和(通过 IBO)进行渲染glDrawElements
?
对我来说有点困惑的是 IBO 如何链接到 VBO 和/或 VAO 并因此链接到当前绘制命令。例如,是否可以使用一个 VBO,然后为不同glDrawElement
的 s 调用绑定到两个不同的 IBO?(例如,如果我想绘制索引为 0、1、2 和 1、2、3 的三角形怎么办;但我想在索引 0、1 和 1、3 之间画线)。
我在代码中将 IBO 与我的 VAO 连接起来的步骤如下:
- 为 VBO 和 IBO 创建缓冲区 ID
- 绑定并填充VBO
- 为 VAO 创建 ID
- 绑定 VAO ( )并
glBindVertexArray
设置我的属性(使用glEnableVertexAttribArray
、glVertexAttribFormat
和)glVertexAttribBinding
glBindVertexBuffer
- 绑定并填写IBO
- 解除绑定 VAO (
glBindVertexArray(0)
)
我还需要使用其他东西(或不同的操作顺序)将 IBO 与 VAO 关联起来吗?
谢谢。
编辑 - 我发现我的编码错误:
当我生成缓冲区时,我一次生成了 4 个到单个数组(用于代码中的这个和其他 OpenGL 缓冲区)。但是,当我将 ID 分配给特定的变量名称时,我对 VBO 和 IBO 都使用索引 0(零)(然后对其他缓冲区使用索引 2 和 3)。基本上,我不小心跳过了索引 1,因此在填写 IBO 时覆盖了我的 VBO。正如下面的评论中所指出的,这个练习至少有助于巩固我对如何在 VBO 的背景下使用 IBO 的理解。谢谢。