3

我一直在想,也许太久了。目前,我有一个名为“Renderer”的抽象基类,它具有渲染和注册对象的虚拟方法(我必须注册对象才能为 VBO 分配内存)。

但是,我不确定是否应该保留它,我想我应该保留基本抽象类。我只是不会创建另一个“渲染器”来使用除 OpenGL 之外的另一个 API 渲染我的对象。所以换句话说,我不会使用 Direct3D 或除 OpenGL 之外的任何其他图形 API。

但是我可能有多个 OpenGL 渲染器的实现,例如一个用于 OpenGL ES 和普通 OpenGL 的实现(如果它们变化那么大,那就是)。

如果我要使用另一个 API,例如 Direct3D,创建上下文可能是我主要关心的问题……我只是不确定如何以一种简洁的方式完成它。

对不起,如果这没有任何意义,我想我已经想了太久了。

4

4 回答 4

1

利用 3D API 并非易事。我仍在为自己努力,尽管 OpenGL 支持仍然大部分缺失,因此 API 具有高度的理论性,至少在我通过 Direct3D 实现达到一个体面的里程碑之前,并在 OpenGL 上找到一些体面的文档,这样我就可以尝试构建 OpenGL 变体,看看我能走多远,以及我的假设有多少实际上符合现实。

那可能是当我看到实现 OpenGL 对现有设计来说只是轻而易举时,或者(更有可能)当我决定放弃 OpenGL(和 MacOS+Linux连同它)完全:-)

我可以这样做,因为它是一个私人宠物项目,无论如何都不会完成。对于任何有可能完成的事情,或者需要完成的事情,我建议不要这样做。这是很多工作。

你必须做的事情至少包括:

  • 使你的 API 足够抽象,这样两个渲染 API 之间就没有应用程序可见的差异,同时又不会失去性能(所以不要通过一直转换东西来做事情。在一些抽象数据收集和转换中拥有一百万个顶点很好每次都使用 Direct3D 或 OpenGL 以获得最大的灵活性, 但这只会给你一个幻灯片. 因此, 在我看来, 要走的路是让渲染 API 实际处理更高级别的数据, 例如模型或场景而不是顶点和三角形)

当然,对我来说一个主要问题是,我不仅试图在不损失性能的情况下抽象出 Direct3D 和 OpenGL,而且还试图在此过程中建立 3D-gfx-know-how。这使得想出“最好的”设计变得困难,并且需要大量的回溯。

  • 决定如何处理着色器(目前,我决定根本不处理这些,只要求应用程序提供这两种实现)。我目前的主要希望寄托在着色器上——假设一旦我掌握了所有技术细节和 API 特定的东西,2012 年的 3D 图形应该主要是在数据和缓冲区上运行着色器的问题。

当然,我可能全都错了,Direct3D/OpenGL 与使用宏通过 1:1 映射处理的事情实际上是一样的,但我很肯定这不是那么简单。它仍然可以在具有一组固定功能的相同硬件上工作,我什至相信 HLSL 和 GLSL 足够相似,最终可以为两者创建一个统一的语言。

尽管如此,我在这里写这些漫无边际的东西的原因是为了劝阻你。据所知(猜猜看,你可能从未听说过我的名字——让你自己猜猜这意味着什么)这是一个相当大的挑战。

于 2012-08-03T08:00:40.203 回答
0

我的问题始终是“即使我现在不想这样做,用替代方法替换这个实现是否有意义”。

对于字符串、向量或代表游戏中玩家的类之类的东西,答案可能是否定的。您可能会更改实现,但您永远不需要超过一个。对于像渲染系统这样的东西,答案是肯定的。用不同的实现替换它确实有意义,因此即使您永远不会编程到抽象也是一个好主意。

当然不要盲目地应用规则,源代码中的效率和不混乱也很重要,但我认为这是一个很好的指导方针。

话虽如此,我不会尝试抽象低级渲染的东西,这太难了。您将如何在根本不具备这种能力的渲染系统上提供可用的曲面细分硬件抽象?相反,我会在“绘制风景”、“绘制 3 模型”、“绘制动画模型”等级别进行抽象。

您可能永远不会实现第二个系统,但这样做是有意义的,因此请提供抽象,除非有明确的理由不这样做。

于 2012-08-03T08:14:40.100 回答
0

取决于你想做什么。为什么要同时支持这两种 API?如果您没有非常令人信服的理由,我会坚持使用适用于 Windows 的 D3D 和适用于 Linux 的 OpenGL。

您可以使用定义渲染器接口的抽象基类来完成您要执行的操作,然后使用两种不同的实现,一种用于 OpenGL,一种用于 Direct3D,但它涉及对所有渲染调用的虚拟函数调用,这将添加高架。

我添加了两个讨论该主题的链接。如果您不必支持多个 API,只需坚持使用适合您目标平台的 API。

http://www.gamedev.net/topic/160063-support-for-both-opengl-and-directx/

http://www.gamedev.net/page/resources/_/technical/graphics-programming-and-theory/striving-for-graphics-api-independence-r1672

于 2012-08-03T03:02:52.837 回答
0

我不明白这是多么有用。由于您将这部分抽象出来,因此对于库用户来说,底层 API 是 Direct3D 还是 OpenGL 都没有区别。它们在功能上是相同的,都做同样的事情。他们使用不同的编程模型并基于不同的设计/营销策略,但它们都没有在任何方面从根本上优于另一个。
两种 API 的狂热分子之间经常发生争斗,但简单的事实是他们做同样的事情。

也就是说,想要支持不同后端的原因之一是可移植性。OpenGL,除了上下文创建和一些小细节(例如打开和关闭垂直同步)之外,已经是可移植的,不需要任何特殊的东西。Direct3D 在 Windows 和 XBox 下运行,仅此而已。

除了 OpenGL 之外,我自己也不会考虑制作 OpenGL ES 后端,因为它很可能足以让你的生活变得不愉快。但当然,这在很大程度上取决于您打算做什么。
对于“简单”的事情,OpenGL ES 在某种程度上也是在您的手机上运行的“只是 OpenGL”。太好了,不是吗?听起来好得令人难以置信。
对于“不那么简单的事情”,OpenGL ES 总是缺少您用于某些效果的一个功能(它对我有用,无论如何,最终我放弃了它)并导致非常头痛找到一种温和的降级方式.

于 2012-08-03T10:42:33.437 回答