用于OpenGL3.1+上下文的分层COLLADA加载器

8

哪些层可以有效地实现这个功能?最好是这三个组件列在早期的层中,然后随着我的编码逐步完成其余部分。

我正在编写一个用于我的图形引擎的COLLADA加载库。当然,一开始我就注意到这似乎是一个相当大的任务。现在我打算编写库以使用不同的层。

我还不了解COLLADA。我假设可能会有:

  • 几何层
  • 着色器层
  • 纹理层

即使对于这些,我也不确定是否需要成为不同类型的分层方案的一部分。

顺便说一句,除非另有建议,否则我将很可能使用irrXML或我刚刚在here读到的有趣的XML库来读取文件。

1个回答

15

您是否了解 Open Asset Import Libraryhttp://assimp.sourceforge.net/)? 它对Collada加载具有相当不错的支持,并针对图形引擎的使用。自己编写Collada加载器不仅难度大,而且需要很长时间才能使其稳定到足以生产使用的程度,主要是因为该格式非常复杂(或者正如Assimp的Collada加载器的主要作者开玩笑地说:几乎是图灵完备的),并且每个导出程序都有自己奇怪的习惯。

如果您需要其他功能,则可以基于Assimp的Collada加载器构建并只添加所需内容(BSD许可证,只要您归属来源即可)。

注意:我与该项目有关联,因此不具备中立性。但在撰写我们自己的Collada加载器遭遇了可怕的经历后,我只是想警告您……

顺便提一下,我将很可能使用irrXML

我们也在使用它。如果您真的要从头开始,请不要这样做。使用DOM解析器,例如TinyXML。 Collada虽然复杂,但非常明确定义,SAX解析器只会使工作更加困难,因为您必须自己构建文档树(而且您需要一个数据结构来表示完整的文档 - Collada元素高度相互关联。要从中读取有意义的信息,需要解决各种交叉引用)。


1
将Assimp的输出数据转换为任何您想要的表示形式都很容易,无论是OpenCl、OpenGl还是其他。如果它缺少您需要支持的某个Collada功能,则需要修改加载器代码。正如我所提到的,您可以简单地基于它进行工作并归属来源,这在法律上是可以的。关于开销:读取像Collada文件这样的复杂XML文件本身就是开销。Assimp也是开销(无论是在内存消耗、图像大小还是处理速度方面)。如果这种开销对您的应用程序来说太大,请考虑[省略] - Alexander Gessler
1
将主应用程序的导入部分删去:无论您如何加载Collada文件,只需加载一次,将其转换为所需的表示形式,保存到磁盘并让您的应用程序加载此优化后的数据块即可。 - Alexander Gessler
1
你得到的是网格(原始顶点和一组可选数据流)、网格邻接(场景图、变换层次结构)、动画通道和材质(只是一个键值存储,大致表示从原始文件中读取的内容)。这些不同的通道或多或少是独立的,尽管它们当然相互引用。 - Alexander Gessler
1
不用担心 noboost。如果您使用 C++ 接口并为每个线程创建和使用一个 Importer 实例,那么一切都会很好。没有线程问题(我不确定文档中是否明确说明了这一点,但请放心,它在未来的版本中也不会改变)。 - Alexander Gessler
“Collada可以做任何事情,甚至包括厨房水槽。实际上,我怀疑它是一种图灵完备的文件格式。” :D - patryk.beza
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接