我想知道为什么当我使用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时分割顶点?
明白了,谢谢先生! – mrcointreau 2016-02-12 09:14:07