2014-09-24 24 views
1

我想知道为什么当我使用Assimp库导入波前对象文件(.obj)时,它会使特定顶点翻倍,并且我在Assimp SourceForge讨论中找到以下答案http://sourceforge.net/p/assimp/discussion/817654/thread/026e9640/?limit=25#ba6c):
Assimp与MeshLab波前对象(.obj)导入

想象一下以下内容:您上传了一系列的顶点到图形卡。然后你通过一个索引缓冲区告诉GPU,你希望第一个三角形由顶点3,6和7组成。第二个三角形则是1,2和6.会发生什么? GPU会为您绘制一个立方体,但立方体的每个角落都会共享相同的UV数据,法向量,顶点颜色或您网格所需的其他任何东西。

现在我们如何获得一个立方体角落,但是在接触角落的所有侧面都得到不同的UV映射?我们不能告诉GPU“使用顶点3,而是使用顶点的UV坐标,而不是使用UV坐标。” GPU不能做到这一点。这就是为什么有必要复制该角落的顶点。现在,您有两个相同位置的顶点,但具有不同的UV坐标。

这就是Assimp为你做的。如果你指定JoinIdenticalVertices,你将得到一个有24个顶点的立方体。为什么?立方体有8个角落,但有3个立方体侧面在每个角落接触,并且每个立方体侧面为该角落设置不同的UV坐标,所以最终每个角落有3个版本。如果你没有指定JoinIdenticalVertices,你会得到一个没有任何重用的普通顶点数组。这意味着你需要2个三角形,每个立方体有3个顶点,最终在36个顶点。

另一种方法是使用3D uv坐标和立方体贴图来贴图。这是一个特殊的情况,只适用于一个立方体,但它可以工作。 GPU然后在内部映射到6个纹理。上面的描述是一般情况,对于每个可能遇到的网格,它都是这样工作的。

它确实有道理。
假设我不知道MeshLab如何处理.obj导入操作怎么回事,如果我找到的答案是正确的,当我导入这样一个对象时顶点计数器不会增加?这只是他们如何进行计数的问题,还是有办法导入.obj文件,而不必在具有法线/切线/ UV时分割顶点?

回答

1

这不是特定于实现的(例如,它们有几个向量 - 每个变量都有一个向量),但逻辑是相同的。

Meshlab除了常见的位置之外,还为每个3D坐标生成一个顶点,其中有几个可能的“值”用于变量,如法线和纹理。这些顶点存储在顶点向量中。

这些多个值存储在一个单独的顶点数据向量中(我将调用VDV)。三角形面将指向VDV中的3个条目,但顶点可指向任意数量的它们。

渲染时,VDV将用于索引目的,但实际顶点用于计算填充物和计算顶点数时。他们对像正常人这样的东西分开“组合”值,认为他们所有的相邻面孔。

+0

明白了,谢谢先生! – mrcointreau 2016-02-12 09:14:07