Blender导出glTF文件存在重复顶点?正确性及原因问询
问题描述
使用Blender 3.6导出默认立方体的glTF文件时,发现POSITION对应的accessor的count为24(预期仅8个顶点),对应的bufferView字节长度为288(预期96),打印出的位置数据每个顶点重复3次。同一模型导出的OBJ文件显示8个顶点,Blender统计也显示8个,但在线glTF viewer可正确渲染该文件,存在以下疑惑:
- 此glTF文件是否正确?
- 顶点重复的原因是什么?
- 是否是对positions数组的解析方式有误?
解答
1. 这份glTF文件完全正确
在线glTF viewer能正常渲染就说明它符合glTF规范,格式上没有问题。
2. 顶点重复的核心原因:「顶点」定义逻辑差异
Blender和OBJ中的"顶点"指的是几何顶点,即空间中唯一的坐标点,立方体确实只有8个这类顶点;但glTF中的"顶点"是渲染顶点,是由POSITION(位置)、NORMAL(法线)、TEXCOORD_0(UV)等属性组合而成的独立单元——只要其中任意一个属性不同,就会被视为不同的顶点。
对于立方体来说,每个几何顶点会被3个相邻的面共享,但每个面中该顶点对应的法线、UV等属性往往不同(比如立方体角落的顶点,三个相邻面的法线分别指向x、y、z三个方向)。为了让GPU能正确计算每个面的光照、纹理效果,glTF会将这些属性不同的"同一空间坐标点"拆分为独立的渲染顶点,8个几何顶点×3个面,刚好得到24个渲染顶点,这就对应了你看到的POSITION数据每个重复3次的情况。
3. 你的解析方式没有问题
你看到的24个POSITION数据是glTF的正常输出,并非解析错误。如果需要还原Blender中统计的8个几何顶点,你可以自行对坐标完全相同的POSITION数据做去重处理,但这一步在渲染流程中是不需要的——GPU正是依靠这些重复的顶点来处理不同面的属性差异,从而实现正确的渲染效果。
内容的提问来源于stack exchange,提问作者Plegeus

