在游戏引擎中结合2D和3D

我已经实现了基本的3Dfunction,并且使用OpenGL ES 2和Box2D在正交投影中做了很less的“2.5D”演示。

现在我想完成二维游戏(使用精灵),并考虑2个变种:

  1. 在单独的图层中将3Dgraphics与3D单独分开,在背景中放置3D物体,使用各种简化algorithm(禁用深度testing,简化的剔除等)绘制2Dgraphics。
  2. 保持一切,使用广告牌的精灵

目前我使用matrix变换实体的分层系统。 我知道三维和二维graphics的计算复杂性,并认为第一种方法应该会导致更快的代码,尽管这是我的第一个引擎,而我的谷歌这次失败了,所以我不确定。

引擎是桌面/移动。

你会推荐什么方法? 执行第一个方法是否值得(在性能方面)?

将2D作为3D对象实现时,如果要混合2D(在3D空间中浮动的2D界面,例如Dead Space),可能会有好处。

在这种方法中,我建议您将3D对象作为2D层次结构的根。 使用传统的2D渲染到根目录下的所有对象的屏幕外缓冲区,然后将其用作3D对象的纹理(不论是否使用)。 你可以拥有任意数量的根(通常在纯2D游戏中只有1个)。

问题在于,在非平凡的情况下,2D渲染通常与3D非常不同地工作。 渲染顺序变得更加重要,试图用传统方式对3D游戏进行多边形sorting往往不能很好地处理大量的2D广告牌。 使用明确的深度图层更快,更容易,并且在一般情况下更为正确。 对于你来说,“更快”一点可能不像你想象的那么重要,尽管它会在真正的大量精灵中变得相关。

就引擎而言,大部分都是用你的第一种方式,因为他们使用一个完全独立的库,比如Scaleform,用于2D渲染。 像Unity这样的其他人可以通过渲染它们来完成某些2Dforms的“优化”(并且可以进行各种几何形状的批处理和深度sorting),但默认情况下,通常只需要使用3D管线直接使用专业的正交相机设置。

简而言之,我建议同时使用两种场景types,但要确保可以将任一视图渲染到纹理,以便将其渲染到其他场景types中。