2013-04-07 223 views
2

我正在制作一个显示行星的2D图形应用程序。我说2D,因为该应用的大部分将是2D。然而,我希望将一些3D对象渲染为离屏(到纹理)的动态精灵,透明(可能是半透明)区域,然后将这些渲染纹理渲染为活动屏幕作为2D纹理四边形。在这种情况下,直接渲染到屏幕上的3D对象不是最优的,因为这需要我实施某种3D拾取。我在数学上还没那么先进。还要注意,主屏幕渲染将是正确的,而屏幕外渲染将是透视。Android /离线渲染纹理

我该如何做到这一点(一般的想法,不需要具体细节),以及最有效的方法是什么?这会减少对各种设备的支持吗?此外,如果3D精灵渲染每隔一帧(例如旋转精细的数量)不断刷新,会不会通过连续卸载/重新加载纹理来消除帧率?我想有些场景可能有多达10个这样的3D屏幕外精灵。

感谢您的帮助

回答

1

如果你真的必须使用屏幕外渲染只是搜索FBO(帧缓冲区对象),并附加一个纹理,然后使用纹理在主视图2D。这是一个非常简单的过程,但可能会降低速度。你可能无法做任何多线程,所以你应该创建一个FBO。它的尺寸可能必须是2的幂,所以如果你愿意,分辨率可能会不同。此过程不会连续加载/卸载任何内容,创建纹理时会分配数据,GL会直接从其中绘制/读取数据。这里最大的缺点就是内存。你将创建多达10个这样的纹理来绘制它们并呈现一次。

将这些对象放置在主缓冲区上的特定位置可能非常容易:使所有逻辑仿佛要绘制全屏行星,但使用“视口”方法将其放置到特定位置屏幕的一部分。

如果这些行星图像只会根据用户请求更新(您不想每帧画出它们),那么我建议您尝试将两者结合起来:创建一个尺寸相同或更大的纹理的FBO然后使用“视口”方法将所有行星绘制成单一纹理。然后你可以更新任何你想要的,只是不清除缓冲区,而是在缓冲区/纹理的特定部分绘制清晰的矩形。并保持绘制整个纹理到主缓冲区。

+0

我想我知道你在说什么。您可能会建议使用视口将我的绘图约束到主屏幕的特定区域,并在那里渲染3D行星。这听起来像一个好主意。但是,(每一帧)创建视区,将渲染模式更改为透视图,渲染行星,然后将视图更改回正切,会更昂贵吗?这可能每帧发生几次。看起来屏幕外缓冲区(FBO)具有其自己的确定渲染状态会使状态更改更少。 – user2255673 2013-04-08 21:59:23

+0

没有任何机会切换视窗和某些矩阵比任何离屏缓冲区慢。此外,如果您使用ES1,甚至不能拥有“自己的确定渲染状态”,则在绘制到另一个缓冲区然后返回时必须将其切换。如果你使用ES2,你可以在两种情况下都有两种程序,每种都有自己的状态。 – 2013-04-09 05:30:23