Android / Offscreen渲染到纹理

时间:2013-04-07 22:58:09

标签: android opengl-es 3d textures sprite

我正在制作一个可以显示行星的2D图形应用程序。我说2D因为应用程序的大部分都是2D。然而,我希望将一些3D对象渲染到屏幕外(到纹理)的动态精灵中,具有透明(可能是半透明)区域,然后将这些渲染纹理渲染为活动屏幕作为2D纹理四边形。在这种情况下,作为3D对象直接渲染到屏幕不是最佳的,因为它需要我实现某种3D拾取。我在数学方面还不是那么先进。另请注意,主屏幕渲染将是正交的,而屏幕外渲染将是透视。

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

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

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

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

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