OpenGL DirectX XNA顶点唯一性当使用或不使用指数时?

时间:2012-02-26 07:27:57

标签: opengl xna directx

这是我在阅读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个索引位置

然后我的观点是,我不需要指数吗?还是我想念这些概念?

2 个答案:

答案 0 :(得分:1)

  

我不可能重复使用那个完全组合的顶点然后指数没用,对吗?

如果你有一个模型,每个面都有自己独特的纹理坐标,是的,指数对你没什么帮助。此外,您没有重复的顶点;你有重复的职位。位置不是顶点;它们是顶点数据的一部分,就像普通的,texcoord等一样。

然而,我无视你实际上向我展示任何合理对象的这样一个模型(即:对于效果没有明确表达的东西,或者就纹理坐标而言没有其他拼凑的东西)。对于具有3000个单独面的模型,所以没有立方体。

在现实世界中,大多数模型都会有大量的顶点重用。如果你不这样做,那么你的建模师在他的工作中是非常糟糕的,或者这是一个非常特殊的案例。

答案 1 :(得分:0)

假设您将缓冲区存储在GPU而非客户端内存中,索引缓冲区将无法在初始化后减少GPU的带宽。相反,它不需要复制顶点数据就可以节省VRAM空间。

如果您的数据设置方式不会重复顶点,则使用索引是多余的,不会节省空间。

通常,您应该将顶点视为一组唯一位置,纹理坐标和法线。如果两个顶点具有相同的位置,但纹理坐标和法线不同,则它们不是同一个顶点,不应该这样对待。

通常在处理由数千个顶点组成的3d模型时,会有很多顶点重叠,使用索引会有很大帮助。有点有趣的是,你没有那么多重复的顶点。

以下是索引有用的地方和不适用的地方的两个示例:

示例1

您正在绘制一个正方形作为两个单独的三角形。

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字节

这不是很多,但这仅适用于单个广场。是的,这个例子不是绘制正方形的最优化方法(你可以通过绘制三角形条而不是三角形来避免第二个例子中的索引),但这是我能想到的最简单的例子。

通常情况下,对于更复杂的模型,您可以将顶点索引在一起,形成非常长的三角形条带或三角形,并节省大量内存。

示例2

你画一个圆圈作为三角扇。如果您不知道三角扇的工作原理,这里有一个非常好的图像可以解释它。在这种情况下,顶点按字母顺序定义A-F。

[

来自维基百科Triangle fan文章的图片。

要使用此方法绘制圆,您可以从任何顶点开始,并按顺时针或逆时针顺序添加所有其他顶点。 (您可以通过将A向下移动到上图中的FB以下来更好地可视化它。它可以使索引顺序且永不重复。

在这种情况下,添加索引缓冲区将是多余的,占用的空间比未编制索引的版本多。索引缓冲区看起来像:

0, 1, 2, 3, 4, ..., n

未编制索引的版本完全相同,只是没有索引缓冲区。


在3d中,您会发现能够找到完全匹配索引的绘图模式,如圆圈示例中所示。在3d中,索引在某种程度上几乎总是有用的。