【问题标题】:OpenGL obj loader in CC中的OpenGL obj加载器
【发布时间】:2014-04-24 04:00:37
【问题描述】:

作为一项学习努力,我正在尝试用 C 语言制作一个 OpenGL(3.3+) 程序,但我在模型加载器上遇到了障碍。 我在互联网上找到的关于加载 obj 文件的所有内容都恰好涉及用于存储顶点和法线的 C++ 向量和 GLM 矩阵,但正如您所知,这些抽象都不适用于 C,我宁愿不使用 C++,因为我不知道C++ 和 C++ 不再只是“带有类的 C”,所以我会误用它。

我知道可能有一些 C 库可以提供与向量和矩阵类似的功能,但我正在尝试具体了解模型加载是如何完成的,但我似乎无法理解所有 C++在互联网上四处游荡(再说一次,我对它不是很熟悉)。

所以我想知道的是,从 C 的角度将模型加载到 OpenGL 中的步骤是什么?

【问题讨论】:

  • 所以您的问题不在于将向量更改为数组(这很简单),而是在 C 中使用 glm::vec3 等?
  • 是的,完全正确,事实上,我确实有一个使用 malloc 等的简单动态数组结构,但我不知道如何重现 GLM 向量和矩阵。另外,如果有人能解释一下这些东西到底是什么东西,我会很感激的。
  • OpenGL 并不真正关心容器是什么,只要它是顺序的。 IIRC 实际上,您仅将指针与大小一起传递给 GL 服务器,以便将该数据复制到 GPU ram。
  • 看起来 GLM 不能从 C 中使用,因为它是 C++“仅标头”库。

标签: c opengl


【解决方案1】:

OpenGL 中没有任何东西需要 C++。 OpenGL 本身被设计为 C API。人们主要使用 C++,因为它开发起来更快。

OpenGL 并不真正关心数据在哪个容器中,无论是 C++ 向量、香草、堆栈上的 C 数组还是使用 malloc 分配的内存池。大多数涉及将数据传输到 GPU 的 GL 函数都采用指向第一个元素的指针和一个大小变量来指示它的长度。

这同样适用于矩阵和多分量向量(不同于 C++ std::vector) - 只要数据正确对齐,您就可以开始了。

这是一个从 QVector4D 类中提取的示例,它与 OpenGL 完美配合。快速浏览一下它的“私人部分”就会发现它什么都没有:

private:
    float xp, yp, zp, wp;

就是这样,4 个浮动并排。看看 4x4 矩阵类 - 也不是火箭科学:

private:
    float m[4][4];          // Column-major order to match OpenGL.

因此,您可以完美地将 OpenGL 与 C 一起使用,GL 功能是相同的,唯一不同的是您将使用“C idioms”而不是 C++。

编辑:对于一个基本的“你好三角形”或一些非常简单的东西,你可以在堆栈上使用一个 C 数组。但是 3D 模型实际上可能包含相当多的顶点,而且您无法提前知道有多少,这使得堆栈数组不适用 - 几何可能超出堆栈并导致......嗯......堆栈溢出和崩溃,加上数组大小必须在编译时知道。

因此,您应该做的是使用malloc(vertCount * sizeof(float) 动态分配内存,根据特定网格的需要,从网格中加载浮点数并使用该“数组”传递给 OpenGL 函数。如果您没有使用过动态内存,请不要担心,只需查找它,它(几乎)与使用堆栈数组相同,请注意您必须手动 free() 该内存,否则它会泄漏.

导入 OBJ 应该不会有太多麻烦,它是一种开放且相当简单的格式。但是解析它是一个完全不同的话题。

【讨论】:

  • 这对我很有帮助,我希望我能投票赞成。所以基本上我可以以与渲染立方体或三角形大致相同的方式渲染模型,除了在前者的情况下我必须加载文件以及我有更多数据要存储到的事实我使用什么类型?通常对于顶点我只会有一个坐标的GLfloats数组,就像我在这个函数lpaste.net/103127中一样。我想我应该更多地了解 obj 文件格式,以了解我需要存储什么以及如何存储它。我做对了吗?
  • 抛开学习努力不谈,尽管我喜欢 C 和重新发明轮子,但从长远来看,我建议您专注于一些提供开箱即用功能的库。不用担心,C++ 并没有那么糟糕……嗯,在某种程度上它很疯狂,但你可以使用它的一个非常基本的子集,它与 C 非常相似,并且仍然可以获得大量的开发时间改进。
  • @Red:我正在维护一个纯 C99 静态内联头库来进行线性数学运算:github.com/datenwolf/linmath.h
  • @datenwolf - 即使不直接使用,也非常具有说明性和教育意义
  • 谢谢你们。 @datenwolf 我想我在 /g/ 上见过你,在那里我就同样的事情做了一个帖子,非常好的回购谢谢。
猜你喜欢
  • 2016-08-17
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多