为啥 3D 模型具有不同 uv 坐标的重复顶点位置

Posted

技术标签:

【中文标题】为啥 3D 模型具有不同 uv 坐标的重复顶点位置【英文标题】:Why do 3D models have duplicate vertex positions with different uv coords为什么 3D 模型具有不同 uv 坐标的重复顶点位置 【发布时间】:2018-04-02 12:39:21 【问题描述】:

我正在尝试从 Blender 导出 Collada 格式,并使用更复杂的对象和纹理,我在索引“p”部分注意到,它将列出相同的顶点信息,但使用不同的法线和 uv 坐标。

我认为非常重要的两个主要问题。

1:为什么?它不应该只有 1 个顶点位置和该位置的 1 个 UV 坐标吗?

2(最重要的问题):如果这个顶点信息被乱序放入顶点着色器会发生什么?例如,索引 1 顶点和索引 10 顶点共享相同的位置,但具有不同的法线和 UV 坐标。如果索引 10 先出现,然后索引 1 会怎样?反之亦然,这是否会改变像素着色器内部的任何内容?这对管道的其余部分有何影响?

谢谢!

【问题讨论】:

【参考方案1】:

一个顶点是由定义它的所有信息的组合定义的。所以你的顶点是五维的:(x,y,z,u,v)。对于任何两个顶点,如果 u1 != u2 或 v1 != v2 它们不是同一个顶点。如果您想说“顶点是位置 A 加上纹理位置 B 加上正常 C 加上 ...”,固定管道 GPU 不支持额外的间接级别,并且添加该级别仍然不是标准的使用可编程 GPU 进行间接寻址,因为它在内存带宽上的花费通常比它节省的要多。你可以,但人们通常不会。

顶点着色器不知道它正在处理的顶点在排序中的位置;只要几何管道保持跟踪,就不会出现问题。

【讨论】:

很好的答案,但是问题 1 呢? GPU 使用“交错的顶点数据”,这意味着所有每个顶点的数据都打包到同一个块中,该块由格式和步幅定义。如果您想拥有具有不同法线、UV、骨骼索引或任何其他每个顶点数据的相同位置,您必须复制它(也称为“分割”)。 GPU 使用“结构数组”,而不是“数组结构”。即使使用多个顶点缓冲区流,每个顶点的所有缓冲区也只有一个索引 对。我对问题一的回答是:没有重复的顶点。顶点(x,y,z,u1,v1)和顶点(x,y,z,u2,v2)是不同的顶点,因为它们有不同的(u,v)s。 为什么一个 3D 模型有相同的顶点但不同的 UV?如果纹理只是包裹在模型之上,为什么需要这样做? 如果有不同的UV,就不是同一个顶点。这是一个不同的顶点。一个模型可能在同一位置有两个顶点,因为它需要映射其源纹理中的不连续性——避免这些在一般情况下是不可能的,例如你将如何绘制一个八字形? — 或者可能是因为它使用了多个纹理并且坐标没有对齐。

以上是关于为啥 3D 模型具有不同 uv 坐标的重复顶点位置的主要内容,如果未能解决你的问题,请参考以下文章

如何从相邻顶点UV计算/推导新的顶点UV

unity3d material怎么使用脚本设置material的tiling和offset

哪些网格数据格式分别提供位置、法线和 UV 坐标的索引?

obj 模型加载纹理坐标和顶点位置未正确加载

如何在 Blender 导出脚本中导出每个顶点的 UV 坐标

3dmax模型导出Obj文件的时候顶点坐标发生变化的问题?