首页 > 解决方案 > 无法使用 OpenGL 渲染 FBX 导入的纹理模型

问题描述

我正在尝试使用带有 OpenGL 的 FBX 文件中的数据来渲染纹理模型,但纹理坐标是错误的。

FBX 文件给出的模型数据摘要包括映射到模型顶点的纹理参考的 UV 坐标。

很明显,该模型有 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 会更好吗?

任何想法/想法/建议表示赞赏。

标签: openglmeshtexture-mappingfbx

解决方案


你是正确的,OpenGL 只支持一个索引缓冲区。

您的 UV 分配代码不正确。您不能只复制 UV,因为顶点和 UV 阵列具有不同的大小。您需要做的是为具有多个 UV 的顶点创建重复顶点,并为每个副本分配一个 UV。

将 UV 和顶点坐标视为包含两者的单个结构并使用它。例子:

struct Vertex
{
   float3 position;
   float2 UV;
};

std::vector<Vertex> vertices;
// Fill "vertices" here.

这也使您可以轻松地交错数据并将整个结果数组上传到一个 VBO 并渲染它。

Would it be better to performing the indexing and expand both "Vertices" and "UVs" to be of size 113958 and simply use glDrawArrays in terms of performance?

这不是性能问题。从字面上看,这是唯一的方法。


推荐阅读