问题标签 [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 回答
46 浏览

c++ - DirectX 大型模型 > 64k C++

我的 DirectX11 C++ 引擎使用 uint16_t(短)作为顶点索引缓冲区,一切运行良好。

我已经改进了我使用的模型,现在它们的索引已经超过 64k。

我已将对索引缓冲区的所有引用从 short 更改为 uint32_t 并且渲染已损坏。

我的变量定义是:

我终于换行了

这样做是为了允许 32 位索引。但是它无法渲染。我也更新了

因此。

欢迎任何建议。

0 投票
1 回答
41 浏览

webgl - Render several graphs from single vertex buffer

I have a vertex buffer containing several (in this case 2) graphs in the following structure:

and its indices

You can notice that for each x value there is 2 y values each determining the graph.

What I want is to render those 2 graphs using this single buffer without any duplication of the x values.

Currently in the render loop I have this:

0 投票
1 回答
1903 浏览

opengl - OpenGL:如何在一次调用中绘制多条线带?

我想绘制多个不同长度的线带。所有顶点都在一个公共缓冲区中。

顺序如下所示:

v_1_1,v_1_2,v_1_3,v_2_1,v_2_2,v_3_1,..对于每个顶点v_i_j,其中i是条带j的索引和条带中顶点的索引。

是否有可能使用索引缓冲区来指定该缓冲区中每个条带的开始和结束索引?

或者有什么其他方法可以解决这个问题?

0 投票
1 回答
270 浏览

opengl - OpenGL索引缓冲区对象元素顺序绘制不正确

在此处输入图像描述

注意我的程序是如何绘制一个三角形的,但我试图在代码中表达的是绘制一个正方形。我tri_indicies相信我的索引缓冲区对象正确地对这些元素进行排序,以便绘制一个正方形,但是在执行程序时,我在 中定义的绘制顺序tri_indicies不会反映在窗口中。不确定错误是否源于tri_indicies,尽管我对元素顺序的更改不会影响我的渲染输出,但我想相信它在这里,但它很可能在其他地方。

我的程序使用抽象来特别是 VertexBuffer、VertexArray 和 IndexBuffer,所有这些都在下面详述。

1.0f稍后在 main 中,我有一个循环,应该将我的正方形绘制到屏幕上并淡化和之间的蓝色值0.0f

0 投票
0 回答
33 浏览

c++ - 如何使用索引缓冲区绘制两个三角形?

我希望使用索引缓冲区绘制具有两种不同颜色的两个三角形(具有一个公共顶点)。我该怎么做?

在不使用索引缓冲区的情况下,只需重复公共顶点数据即可轻松绘制两个这样的三角形。是的,我仍然可以使用索引缓冲区。但在这种情况下,使用索引缓冲区没有任何优势。我的顶点数据如下:

我通过以下方式设置属性布局:

我的顶点类定义如下:

使用上述设置,我得到了一个完美的红色三角形,但不是预期的绿色三角形。此外,尽管只有两种独特的颜色,但我必须重复这些颜色。由于三角形是形成平面的最简单的几何对象类型,因此在很多情况下,两个相邻的三角形(共享一个或两个顶点)需要使用不同的常量颜色进行渲染。我想利用索引缓冲区,同时还想用恒定颜色渲染两个相邻的三角形。

使用两种独特的颜色而不是 5 种多余的颜色将是一个额外的好处。

有什么有效的方法可以做到这一点吗?

[@Nicol Bolas:我什至在发布这个问题之前检查了那个链接。由于我只能使用一个索引缓冲区,因此诀窍实际上在于对索引进行排序以同时适合位置和颜色数据。但是,有 5 个位置和两种独特的颜色。如果我安排索引以适合该位置,我必须定义

但是,如果我希望拟合颜色数据,我需要索引为

只要我复制颜色。]

0 投票
1 回答
69 浏览

algorithm - 查找哪些三角形共享一个顶点的最快算法

有索引和顶点缓冲区,就像这里描述的那样来绘制三角形

在我的代码中,我经常需要查找哪些三角形共享一个特定的顶点。最基本的方法是:

  • 循环索引缓冲区并找到包含该特定顶点索引的三角形。

现在我想知道我是否缺少更有效或标准的算法。谢谢。

0 投票
1 回答
102 浏览

c++ - DirectX11 每个三角形使用缓冲区中的第一个顶点

我目前的 DirectX 11 体素渲染器出现问题,每当渲染三角形时,都会使用缓冲区中的第一个顶点,而不是使用正确的顶点之一。

我在 Unity 中有一个相同网格生成算法的工作版本,在比较了索引和顶点之后,它们完全相同,所以我不认为问题出在算法上。

我知道缓冲区中的第一个顶点正在使用的原因是因为为每个块创建的第一个顶点位于块的原点。每个块 GameObject 的世界位置是 (0, 0, 0),并且块的位置只是在构造每个块的网格时作为每个顶点的偏移量添加的。

正如您在下图中看到的,三角形正在拉伸到块的原点(第一个顶点)。仍然可以看到体素地形的山地形状,因此一些顶点被渲染在正确的位置。我只是不明白为什么似乎每三个索引都设置为 0(我不确定这是否真的发生了,它看起来就像我想象的那样)。

三角形拉伸的图像

这是我用于为每个块创建顶点和索引缓冲区的代码。m_vertices 和 m_indices 都是向量,当我比较它们时,它们与工作的 Unity 版本相同。

体素网格结构:

0 投票
1 回答
1215 浏览

glsl - 在 GLSL 顶点着色器中,您可以访问索引缓冲区中顶点的索引,而不仅仅是顶点缓冲区吗?

我在 Vulkan 中渲染一个基元,它具有重复的顶点,顶点着色器根据顶点缓冲区中的索引对这些顶点进行不同的处理。所有重复的顶点都是连续的,所以如果 a、b、c 是顶点,缓冲区可能看起来像[a,a,a,b,b,b,c,c,c],我需要能够在我的顶点着色器中判断这是第一次、第二次还是第三次看到相同的顶点。

如果我只是将同一个顶点多次提交到顶点缓冲区,我可以使用gl_VertexIndex(或gl_VertexID在 OpenGL 中)确定它是同一顶点的重复次数,然后根据需要以不同的方式处理每个重复。

但是,我想使用索引缓冲区来避免重复内存中的顶点。当使用索引缓冲区gl_VertexIndex时,每次出现相同的索引时都是相同的值,因为它是顶点缓冲区的索引,每个顶点只有一个副本,因此索引缓冲区是值得的。这意味着在顶点着色器中,我无法区分顶点的第一次、第二次或第三次重复。

gl_VertexIndex是否有一个像我可以使用的内置变量,例如gl_IndexBufferIndex它告诉我这个顶点来自索引缓冲区中的哪个索引?或者,这个顶点在索引缓冲区中已经遇到了多少次?如果没有,是否有一种有效的方法可以在每个顶点的基础上将此信息发送到顶点着色器?

根据 Vulkan 规范 1.2.146 §8.7.1,顶点着色必须为相同的索引重复,除非它保证相同的结果,所以这应该是可能的:

如果在绘制命令中多次指定相同的顶点(例如,通过在索引缓冲区中多次包含相同的索引值),如果它可以静态确定顶点着色器调用将产生相同的结果,则实现可以重用顶点着色的结果.

0 投票
1 回答
174 浏览

three.js - 三.JS r97 问题 GL ERROR :GL_INVALID_OPERATION : glDrawElements: 尝试访问属性 2 中超出范围的顶点

我将这个问题作为最后的手段发布。我已阅读该网站上的所有类似主题。这是问题所在:

我正在使用旧版本的 Three.JS (r97) 并且不能更新到最新版本。我正在研究一个体素生成器,它接收代表体素中心的坐标列表(x,y,z)作为输入。

对于每个中心坐标,我将 8 个新顶点和 12*3 索引(12 个三角形)附加到顶点和索引缓冲区。每个体素的“蓝图”都是 THREE.BoxGeometry,但代码应该适用于其他 THREE.Geometry。

我遇到以下错误:GL ERROR :GL_INVALID_OPERATION : glDrawElements: attempt to access out of range vertices in attribute 2。我如何设置缓冲区肯定有问题,但我无法深入了解。任何帮助表示赞赏。谢谢!

这是代码:

0 投票
1 回答
90 浏览

directx-11 - 为什么 Directx11 不支持 IASetIndexBuffer 中的多个索引缓冲区

您可以使用 IASetVertexBuffers 设置多个顶点缓冲区,但 IASetIndexBuffer 没有复数版本。如果您无法使用单独的索引缓冲区引用它们,那么创建(非交错)多个顶点缓冲区数据的意义何在

(假设我有一个名为 vector3 的结构,带有 3 个浮点 x、y、z)

假设我有一个具有 250.000 个顶点和 1.000.000 个三角形的人类模型;

  • 我将为顶点位置创建一个大小为 250.000 * sizeof(vector3) 的顶点缓冲区,并且,
  • 我将为顶点法线创建另一个大小为 1.000.000 * 3 * sizeof(vector3) 的顶点缓冲区(并且可能为漫反射纹理创建另一个)

我可以设置这些顶点缓冲区,如:

如果 IASetIndexBuffer 仅支持 1 个索引缓冲区,我如何为这些顶点数据设置单独的索引缓冲区

还有(我知道有一些贴花技术,比如从原始模型创建额外的三角形,但是)假设我想在这个人类模型的脸上(比如说前额)渲染一个像疤痕一样的小纹理,这个疤痕只会通过4 个三角形,是否可以创建一个 uv 缓冲区(只有 4 个三角形)并为仅 4 个三角形的位置、法线和 UV 创建 3 个不同的索引缓冲区,但使用相同的原始顶点缓冲区(来自完整人体模型的相同数据)。我不想创建大量的 uv 数据,这些数据永远不会在字符前额旁边渲染(我不想重复使用,为这个辅助纹理层(贴花)重新创建顶点位置数据)

编辑:我意识到我没有正确提出问题,所以我的问题是:

  • 我是否误解了非交错模型结构(是否出于其他原因使用它而不是具有未对齐的顶点组件)?
  • 还是我接近非交错结构错误(有没有办法定义多个非对齐顶点缓冲区并仅用一个索引缓冲区绘制它们)?