2012-08-03 41 views
3

我一直在想,也许太久了。目前,我有一个名为“Renderer”的抽象基类,它具有渲染和注册对象的虚拟方法(我必须注册对象来为VBO分配内存)。但是,我不确定是否应该保持这种状态,我想我应该保留基本的抽象类。我只是不会创建另一个“Renderer”,它将使用OpenGL以外的其他API呈现对象。换句话说,除了OpenGL,我不会使用Direct3D或任何其他图形API。设计一个“渲染器”,是否有一点使用OpenGL以外的API?

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

如果我要使用另一个API,比如Direct3D,创建上下文可能会成为我的主要关注点......我只是不确定该如何以一种整洁的方式来完成。

对不起,如果这没有任何意义,我想我一直在想太久。

回答

1

利用3D API中是不容易的任务;尽管OpenGL支持仍然大部分缺失,并且API因此具有很高的理论性,但至少直到我通过Direct3D实现达到体面里程碑,并在OpenGL上找到一些体面的文档,我才能尝试建立OpenGL变体,看看我能得到多少,以及我的假设有多少符合实际。

当我看到实现OpenGL仅仅是现有设计的微风,或者(更可能)当我决定放弃OpenGL(或许更有可能)的时候,我很可能会对这样的天才感到惊讶。和MacOS + Linux一起)完全:-)

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

事情,你需要做的,至少包括:

  • 让您的API足够抽象所以有两种渲染API之间不存在应用程序可见的差异,而不是失去的性能(所以不要做的事情在一些抽象数据集合中有一百万个顶点并且每次都将其转换为Direct3D或OpenGL以获得最大的灵活性,但这只会给您一个幻灯片。因此,在我看来,要走的路是对的渲染API实际上与更高级别的数据,如模型或场景,而不是顶点和三角形)

当然工作,对我来说是重要的问题是,我我不仅试图在不丢失性能的情况下将Direct3D和OpenGL抽象出来,还尝试在此过程中构建3D-gfx知识。这使得很难提出“最好”的设计,并且需要很多回头。

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

当然,我可能都是错误的,Direct3D/OpenGL是可以通过使用宏的1:1映射处理的相同的东西,但我很积极,这并不那么简单。它仍然可以在具有一组固定功能的相同硬件上运行,我甚至相信HLSL和GLSL足够相似,最终可以为这两种语言构建统一的语言。

不过,我写这里所有散布在这里的原因是让你灰心。据可以告诉(并猜测是什么,你可能从来没有听说过我的名字 - 让你自己猜测这意味着什么)这是一个相当大的挑战。

0

取决于你想要做什么。你为什么要支持这两种API?如果你没有一个非常有说服力的理由,我会坚持使用D3D for Windows和OpenGL for Linux。

你想要做的事情可以使用抽象基类来完成,该基类定义了渲染器的接口,然后是两个不同的实现,一个用于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

0

我的问题总是“用替代方案替换这个实现是否合理,即使我现在不想这样做”。

对于类似字符串,矢量或代表游戏中玩家的类,答案可能不是。你可能会改变实现,但你永远不需要多于一个。对于像渲染系统这样的答案是肯定的。将它替换为不同的实现是有意义的,因此即使您从不会这样做,编程为抽象也是一个好主意。

虽然盲目不适用规则,但源代码中效率和杂乱无章也很重要,但我觉得这是一个很好的指导原则。

说了这些之后,我不会尝试抽象低级渲染的东西,这太难了。你如何在一个没有这种能力的渲染系统上提供可用的tesselation硬件抽象?相反,我会在“绘制风景”,“绘制3模型”,“绘制动画模型”等级上进行抽象化。

您可能永远不会实现第二个系统,但这样做很有意义,所以除非有积极的理由不要提供抽象。

0

我不明白这是如何非常有用的。由于您正在抽象出这部分内容,因此,无论底层API是Direct3D还是OpenGL,它都不会影响库用户。它们在功能上是完全相同的,两者完全相同。他们正在使用不同的项目模式,并基于不同的设计/营销策略,但他们都没有以任何方式从根本上优于其他。
这两个API的粉丝之间经常发生争斗,但简单的事实是他们也这样做。

也就是说,人们希望支持不同后端的一个原因是可移植性。除了上下文创建和一些小的细节(例如打开和关闭垂直同步)之外,OpenGL已经是便携式的,不需要任何特殊的东西。 Direct3D可以在Windows和XBox下运行,而且非常适合。

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