如何在WebGL中使用索引缓冲区?

如何在WebGL中使用索引缓冲区?,webgl,Webgl,可能重复: 这是关于使用索引缓冲区渲染自定义几何体,如从OBJ文件中。我对3d图形惯例略知一二,但我对WebGL没有太多的了解。 我的问题的简短形式是“如何在WebGL中使用索引缓冲区?” 我想做的是,对于一个自定义几何体,创建一个活动位置向量列表和一个活动UV向量列表(让我们跳过法线)。然后,当我去画三角形时,我只想用指向三个现有位置向量的指针和指向三个现有UV向量的指针来定义每个三角形。(仅仅因为OBJ就是这样设置的) 从我所读到的(我发誓我用谷歌搜索了100种不同的方式,无法得到一个结论

可能重复:

这是关于使用索引缓冲区渲染自定义几何体,如从OBJ文件中。我对3d图形惯例略知一二,但我对WebGL没有太多的了解。 我的问题的简短形式是“如何在WebGL中使用索引缓冲区?”

我想做的是,对于一个自定义几何体,创建一个活动位置向量列表和一个活动UV向量列表(让我们跳过法线)。然后,当我去画三角形时,我只想用指向三个现有位置向量的指针和指向三个现有UV向量的指针来定义每个三角形。(仅仅因为OBJ就是这样设置的)

从我所读到的(我发誓我用谷歌搜索了100种不同的方式,无法得到一个结论性的答案),你必须将UV和位置合并为一个顶点,然后三角形被定义为指向其中三个垂直的指针。但是,如果UV列表的长度与位置列表的长度不同,会发生什么情况

假设我有一个立方体。这是八个位置向量。但是,假设每个面都具有相同的方形UV布局(渲染时,每个面看起来应该相同)。这是四个(独特的)UV。现在怎么办


就像我不得不放弃这个方法,咬紧牙关,为所有12个三角形定义每个位置和UV——代价是沿立方体边重复位置向量,沿面对角线重复UV。如果这是公认的做法,那很好,我只想确定我的做法是正确的。

包含顶点位置、纹理坐标、法线等的数组长度必须相同。在许多情况下,这意味着冗余数据。多维数据集就是冗余性特别差的一个例子。实际上,您必须传入24个顶点和24个texcoords。

您已经听说不能重用立方体顶点,但对于其他上下文,请注意,现代3D内容有许多平滑的非平面曲面;因此,三角形之间的大多数连接可以共享顶点,因为它们具有相同的法线和其他属性。属性不连续的尖锐边缘是不太常见的情况,因此不应针对其进行优化。

感谢foijord的及时响应——这正是我需要听到的。我会记住的。谢谢你,凯文。是的,我现在可以看到,当你谈论具有“网格”拓扑的几何体时,索引缓冲区真的很亮,比如地形之类的东西:你有所有这些垂直,可以共享UV、位置、法线等,而没有冗余。