问题标签 [index-buffer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
53 浏览

c++ - 绑定到 VAO 后,我可以 glDeleteBuffer 一个 VBO 和 IBO 吗?

我读过 VBO(顶点缓冲区对象)本质上保留了一个引用计数,因此如果 VBO 的名称被赋予glDeleteBuffers(),如果一个活的 VAO(顶点数组对象)仍然引用它,它并没有真正被解雇。这种行为类似于“智能指针”,较新的语言越来越多地采用。但是在多大程度上这是正确的并且可以围绕它进行设计,如果它也适用于 IBO(索引缓冲区对象),我还没有找到任何信息。

如果 VBO 由引用它的 VAO 保持活动状态,并且我不打算在 VAO 死亡后更新或使用它,我认为最好的做法是销毁我对它的引用。这样做合适吗?我可以对 IBO 做同样的事情吗?

0 投票
1 回答
58 浏览

directx-11 - 使用单独的顶点缓冲区和纹理坐标缓冲区和多个索引来绘制 tris DirectX11

所以我看到这些帖子DX10+ multiple vertex buffers, single index bufferUsing Multiple Vertex Buffers In DX10/DX11并且模糊理解为什么 Directx11 不支持 IASetIndexBuffer 中的多个索引缓冲区

在渲染索引 tris 时,我想知道是否可以有一个顶点缓冲区和一个单独的纹理坐标缓冲区。但是然后在绘制时指定三角形,例如顶点缓冲区中的一组索引和纹理坐标缓冲区中的一组索引(单独),因此每个三角形总共有 6 个索引。这样我就可以重用纹理坐标和顶点。因为否则我必须为我不太热衷的每个纹理坐标复制顶点。

这在 DirectX 11 中可行吗?

0 投票
0 回答
77 浏览

opengl - Rust/OpenGL - 加载 OBJ 文件时缺少顶点索引

我正在尝试使用模块将 .obj 文件中的模型加载到 OpenGL 中gliumwavefront_obj我可以很好地获取顶点和法线,但似乎这个库没有读取索引缓冲区的索引(https:/ /docs.rs/wavefront_obj/10.0.0/wavefront_obj/obj/struct.Object.html)。

我加载模型的代码如下:

我得到的结果是这样的: OpenGL 茶壶

我还没有找到通过图书馆文档阅读的解决方案,有没有更好的图书馆或者我可以应用任何方法来获取这些索引?

0 投票
1 回答
49 浏览

opengl - 为 glDrawArrays(忽略 IBO)和 glDrawElements(带有 IBO)使用一个顶点缓冲区对象

我有一个顶点缓冲区对象 (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 连接起来的步骤如下:

  1. 为 VBO 和 IBO 创建缓冲区 ID
  2. 绑定并填充VBO
  3. 为 VAO 创建 ID
  4. 绑定 VAO ( )并glBindVertexArray设置我的属性(使用glEnableVertexAttribArrayglVertexAttribFormat和)glVertexAttribBindingglBindVertexBuffer
  5. 绑定并填写IBO
  6. 解除绑定 VAO ( glBindVertexArray(0))

我还需要使用其他东西(或不同的操作顺序)将 IBO 与 VAO 关联起来吗?

谢谢。


编辑 - 我发现我的编码错误:

当我生成缓冲区时,我一次生成了 4 个到单个数组(用于代码中的这个和其他 OpenGL 缓冲区)。但是,当我将 ID 分配给特定的变量名称时,我对 VBO 和 IBO 都使用索引 0(零)(然后对其他缓冲区使用索引 2 和 3)。基本上,我不小心跳过了索引 1,因此在填写 IBO 时覆盖了我的 VBO。正如下面的评论中所指出的,这个练习至少有助于巩固我对如何在 VBO 的背景下使用 IBO 的理解。谢谢。