用于 OpenGL3.1+ 上下文的分层 COLLADA 加载器
Posted
技术标签:
【中文标题】用于 OpenGL3.1+ 上下文的分层 COLLADA 加载器【英文标题】:Layered COLLADA Loader for OpenGL3.1+ Context 【发布时间】:2011-06-22 06:25:26 【问题描述】:哪些层有助于有效地实现这一点?最好是这样我就能够将下面列出的这三个组件与早期层一起使用,并在我进行时对其余部分进行编码。
我正在编写一个 COLLADA 加载库以与我的图形引擎一起使用。所以当然,一开始我就注意到这似乎是一项相当大的任务。我现在打算编写库以使用不同的层。
我不还了解 COLLADA。我假设可能有:
几何层 着色器层 纹理层即使这些我不确定,也可能需要属于不同类型的分层方案。
旁注,除非另有说明,否则我很可能会使用 irrXML 或 interesting XML library 我刚刚阅读了有关 here 的信息来阅读文件。
【问题讨论】:
【参考方案1】:您知道开放资产导入库 (http://assimp.sourceforge.net/) 吗?它对 Collada 加载和图形引擎中的目标使用提供了相当不错的支持。自己编写一个 collada 加载器不仅很难,而且还需要很长时间才能使其足够稳定以用于生产性使用,主要是因为格式非常复杂(或者,正如 Assimp 的 Collada 加载器的主要作者开玩笑说的那样:几乎图灵完备),每个出口商都有自己的奇怪习惯。
如果您需要额外的功能,您可以在 Assimp 的 Collada 加载程序的基础上添加您需要的内容(BSD 许可证,只要您注明来源即可)。
注意:我隶属于该项目,因此并非公正。但是在我们编写自己的 Collada 加载程序时经历了可怕的经历之后,我只是觉得不得不警告你……
旁注,我很可能会使用 irrXML
我们也使用它。 如果你真的要从头开始,不要。使用 DOM 解析器,例如 TinyXML。 Collada 很复杂,但定义非常明确,SAX 解析器只是加强了工作,因为您必须自己构建文档树(并且您*将**需要一个类似于完整文档的数据结构 - Collada 元素是高度互连的。要从中读取有意义的内容,需要解决各种交叉引用)。
【讨论】:
您能否推荐合适的层来将 OpenAsset 加载器与支持全部功能的渲染引擎连接起来?我听说过这个库,但总是担心我不知道的开销和多线程/流式传输的困难。如果您对此有任何意见,我将不胜感激。 很容易将 Assimp 的输出数据转换为您喜欢的任何表示形式,无论是 OpenCl、OpenGl 等等。如果它不支持您需要支持的某个 Collada 功能,则需要修改加载程序代码。正如我所提到的,您可以简单地将您的工作基于它并确定来源,这在法律上是可以的。关于开销:读取像 Collada 文件这样的复杂 XML 文件是开销。 Assimp 是开销(在内存消耗、图像大小和处理速度方面)。如果该开销对您的应用程序来说太大,请考虑 [snip] 从主应用程序中删除导入部分:加载您的 collada 文件一次(无论您如何执行此操作),将它们转换为您想要的表示,将其保存到磁盘并让您的应用程序加载此优化斑点。 嗯,你得到的是网格(带有一组可选数据流的原始顶点)、网格邻接(场景图、转换层次结构)、动画通道和材质(它们只是一个键值存储代表大致从原始文件中读取的内容)。这些不同的渠道或多或少是独立的,尽管它们当然会相互引用。 别担心noboost
。如果您使用 C++ 接口并为每个线程创建和使用一个 Importer 实例,那一切都会好起来的。没有线程问题(我不确定文档中是否明确说明了这一点,但请放心,它在未来的版本中不会改变)。以上是关于用于 OpenGL3.1+ 上下文的分层 COLLADA 加载器的主要内容,如果未能解决你的问题,请参考以下文章