【发布时间】:2019-10-09 08:32:11
【问题描述】:
我正在尝试使用带有 OpenGL 的 FBX 文件中的数据来渲染纹理模型,但纹理坐标错误。
FBX 文件给出的模型数据摘要包括映射到模型顶点的纹理参考的 UV 坐标。
- 顶点数:19895
PolygonVertexIndices 数量:113958
UV 数量:21992
UVIndices 数量:113958
很明显,模型有 113958 个感兴趣的顶点。据我了解,“PolygonVertexIndices”指向“顶点”,“UVIndices”指向“UV”值。
我使用带有 GL_TRIANGLES 的 glDrawElements 来渲染模型,使用“PolygonVertexIndices”作为 GL_ELEMENT_ARRAY_BUFFER,“顶点”作为 GL_ARRAY_BUFFER。模型本身可以正确渲染,但纹理效果不佳。
由于我对 GL_ELEMENT_ARRAY_BUFFER 使用“PolygonVertexIndices”,据我了解,对于 UV 坐标的属性数组也会发生相同的索引。我不认为 OpenGL 可以使用导出的 UV 索引,因此我为大小为 113958 的 UV 值创建了一个新缓冲区,其中包含与“PolygonVertexIndices”相对应的相关 UV 值。
即对于 [0:113958] 中的顶点 i,我会这样做
new_UVs[PolygonVertexIndices[i]] = UVs[UVIndices[i]]
然后将new_UVs绑定为UV坐标属性数组。
但是,纹理显然是错误的。我的思路有问题吗?
我觉得我在使用 OpenGL 的索引渲染 glDrawElements 时误解了如何使用 UV 缓冲区。扩展我的 UV 缓冲区以将顶点数匹配到 113958 也感觉不对,因为 glDrawElements 的优势应该是保存重复的顶点值,并且 UV 缓冲区可能包含重复项。
执行索引并将“顶点”和“UV”扩展为 113958 大小并在性能方面简单地使用 glDrawArrays 会更好吗?
感谢任何想法/想法/建议。
【问题讨论】:
标签: opengl mesh texture-mapping fbx