这是我在阅读FBX文件时得到的内容
Normals Count = 6792
TextureCoords Count = 6792
Faces = 2264
Vertices = 3366
我没有得到的是为什么我的Vertices比Normals / TextCoords少
我需要你的帮助来了解何时应该使用Index Buffer而不是
索引缓冲区有助于减少图形卡的带宽,得到它。 得到它后,索引缓冲区有助于不重复顶点和SAME数据。
假设我有一个由顶点组成的1000个顶点和3000个面的模型, 因此,一个9000个元素的索引缓冲区(每个面3个索引)
我有1000个独特的Positions数组,但有9000个独特的TextCoords和Normals数组
如果顶点只是位置,这是索引缓冲区的最佳方案,没有多余的顶点
但碰巧我还有TextureCoords和Normals,每个面部每个位置可以有不同的值,换句话说,面部之间共享的位置,但每个面具有不同的属性
因此,顶点的唯一性将是-Position AND TextureCoord AND Normal -
我不可能重复使用那个完全组合的顶点然后指数没用,对吗?
我需要为每个TextureCoord和Normal
重复Position最终我似乎无法利用只有1000个索引位置
然后我的观点是,我不需要指数吗?还是我想念这些概念?
答案 0 :(得分:1)
我不可能重复使用那个完全组合的顶点然后指数没用,对吗?
如果你有一个模型,每个面都有自己独特的纹理坐标,是的,指数对你没什么帮助。此外,您没有重复的顶点;你有重复的职位。位置不是顶点;它们是顶点数据的一部分,就像普通的,texcoord等一样。
然而,我无视你实际上向我展示任何合理对象的这样一个模型(即:对于效果没有明确表达的东西,或者就纹理坐标而言没有其他拼凑的东西)。对于具有3000个单独面的模型,所以没有立方体。
在现实世界中,大多数模型都会有大量的顶点重用。如果你不这样做,那么你的建模师在他的工作中是非常糟糕的,或者这是一个非常特殊的案例。
答案 1 :(得分:0)
假设您将缓冲区存储在GPU而非客户端内存中,索引缓冲区将无法在初始化后减少GPU的带宽。相反,它不需要复制顶点数据就可以节省VRAM空间。
如果您的数据设置方式不会重复顶点,则使用索引是多余的,不会节省空间。
通常,您应该将顶点视为一组唯一位置,纹理坐标和法线。如果两个顶点具有相同的位置,但纹理坐标和法线不同,则它们不是同一个顶点,不应该这样对待。
通常在处理由数千个顶点组成的3d模型时,会有很多顶点重叠,使用索引会有很大帮助。有点有趣的是,你没有那么多重复的顶点。
以下是索引有用的地方和不适用的地方的两个示例:
您正在绘制一个正方形作为两个单独的三角形。
v0---v3
|\ |
| \ |
| \|
v1---v2
由于这个例子是在2d中,我们只能真正使用位置和纹理坐标。如果没有索引,如果将位置和纹理坐标交错在一起,顶点缓冲区将如下所示:
p0x, p0y, t0x, t0y,
p1x, p1y, t1x, t1y,
p2x, p2y, t2x, t2y,
p0x, p0y, t0x, t0y,
p2x, p2y, t2x, t2y,
p3x, p3y, t3x, t3y
使用索引时,顶点缓冲区将如下所示:
p0x, p0y, t0x, t0y,
p1x, p1y, t1x, t1y,
p2x, p2y, t2x, t2y,
p3x, p3y, t3x, t3y
你将拥有一个如下所示的索引缓冲区:
0, 1, 2,
0, 2, 3
假设您的顶点数据全部为float
且索引为byte
s,则未编入索引的空间量为 96字节,索引为 70字节强>
这不是很多,但这仅适用于单个广场。是的,这个例子不是绘制正方形的最优化方法(你可以通过绘制三角形条而不是三角形来避免第二个例子中的索引),但这是我能想到的最简单的例子。
通常情况下,对于更复杂的模型,您可以将顶点索引在一起,形成非常长的三角形条带或三角形,并节省大量内存。
你画一个圆圈作为三角扇。如果您不知道三角扇的工作原理,这里有一个非常好的图像可以解释它。在这种情况下,顶点按字母顺序定义A-F。
来自维基百科Triangle fan文章的图片。
要使用此方法绘制圆,您可以从任何顶点开始,并按顺时针或逆时针顺序添加所有其他顶点。 (您可以通过将A
向下移动到上图中的F
和B
以下来更好地可视化它。它可以使索引顺序且永不重复。
在这种情况下,添加索引缓冲区将是多余的,占用的空间比未编制索引的版本多。索引缓冲区看起来像:
0, 1, 2, 3, 4, ..., n
未编制索引的版本完全相同,只是没有索引缓冲区。
在3d中,您会发现能够找到完全匹配索引的绘图模式,如圆圈示例中所示。在3d中,索引在某种程度上几乎总是有用的。