.Net 中的 OpenGL 包装器

Posted

技术标签:

【中文标题】.Net 中的 OpenGL 包装器【英文标题】:OpenGL Wrapper in .Net 【发布时间】:2010-04-27 09:44:08 【问题描述】:

这个问题类似于the one here。但是我觉得推荐的答案(如Tao和OpenTK)还不够好,因为它们只是OpenGL的直接端口,没有OOP设计,很难使用。

我正在寻找的是一个 .Net OpenGL 包装器,它以明确的 OOP 原则编写,易于使用(易于应用文本和照明,易于调试等),能够用鼠标旋转 3D 图(a OpenGL 和 TAO 严重缺失的功能),以及导出为其他文件格式(例如 dwg 或 dxf 或 Google Map 文件格式)的能力。

有什么建议吗?开源或商业组件都可以。

【问题讨论】:

听起来像可视化库 (visualizationlibrary.com) 将满足您的需求。不幸的是,它不是 .Net,您可以尝试使用 SWIG (swig.org) 为其生成包装器。不过,这可能需要一些工作...... 好吧,openGL 不是建立在 OOP 原则之上的,所以不可能有任何 OOP 包装器。 @Yossarian,尽管A 不是基于 OOP 构建的,但包装器可以是 OOP。我可以提供的一个例子是 Symfony,它是一个包裹在 php 之上的 OOP 框架,它是你能得到的最程序化的。 @Yossarian:存在诸如适配器设计模式之类的软件工程实践以允许不同软件之间的互操作。参考en.wikipedia.org/wiki/Adapter_pattern 【参考方案1】:

虽然您认为 OOP 包装器是可能的是正确的,但事实是您需要首先了解 OpenGL 的工作原理(任何包装器 API 都是如此,对于 OpenGL 更是如此)。由于您发现 OpenGL API 很难使用,因此您可能对渲染的理解还不足以使用任何包装器 API。

大多数包装器避免使用繁重的类框架,因为存储每个对象的状态并将其发送到每个对象的 GPU 效率非常低,并且会降低帧速率。作为程序员,你需要意识到这些痛点,而不是试图将它们隐藏在抽象包装层后面。图书馆设计师无法为您解决这些问题。

【讨论】:

【参考方案2】:

看看

MOGRE osgDotNet

【讨论】:

【参考方案3】:

最大的问题是 OpenGL 不是一个 OOP 框架,它是一个状态机 (http://en.wikipedia.org/wiki/Finite-state_machine),因此任何对 OOP 库的转换都会增加复杂性,从而减慢您的程序。所以要么将其用作状态机,要么查看 OGRE 之类的 OOP 库。但对于很多事情来说,OGRE 的限制太大了。

归根结底,为什么需要 OpenGL 的 OOP?库按它原来的方式编写是有原因的,那是因为它非常干净地映射到它下面的硬件。显卡不会在 OOP 中思考,它是一个状态机,用于对其进行编程的库反映了这一点。

【讨论】:

【参考方案4】:

也许太自大了,但我在写我自己的抽象。它在大多数情况下都有效,但处于计划状态,但可以让您了解如何实现“OpenGL”OOP 抽象。

看SVN:http://sourceforge.net/projects/genomalib/develop

当然,它不是生产代码的解决方案,但它是开源的,并且在您获得设计后易于扩展。最近我添加了“不推荐使用”的 API,因为它最初是为仅使用着色器渲染而编写的(实际上它仍然缺少对“旧”硬件的支持);但我肯定有渲染的资金......

【讨论】:

以上是关于.Net 中的 OpenGL 包装器的主要内容,如果未能解决你的问题,请参考以下文章

Python中的Tkinter OpenGL上下文

NamedPipeServerStream/NamedPipeClientStream 包装器

是否有用于 WinInet 的 .Net 包装器

Java中包装器类的行为[重复]

用于包装 SDL 和 OpenGL 绘图方法的虚拟函数的替代方案

自动生成函数的类型安全包装,然后仅使用 `__typename` 作为参数动态调用。打字稿