Android/屏幕外渲染到纹理

Android/屏幕外渲染到纹理,android,opengl-es,3d,textures,sprite,Android,Opengl Es,3d,Textures,Sprite,我正在制作一个2D图形应用程序,可以显示行星。我说2D是因为大部分应用程序都是2D。但是,我希望将一些3D对象渲染到屏幕外的动态精灵(到纹理),并带有透明(可能是半透明)区域,然后将这些渲染纹理渲染到活动屏幕上,作为2D纹理四边形。在这种情况下,将3D对象直接渲染到屏幕不是最佳效果,因为这需要我执行某种3D拾取。我的数学还没那么高。还请注意,主屏幕渲染将是正交的,而屏幕外渲染将是透视的 我怎样才能做到这一点(总体思路,不需要细节),最有效的方法是什么?这会减少对各种设备的支持吗?此外,如果3D

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

我怎样才能做到这一点(总体思路,不需要细节),最有效的方法是什么?这会减少对各种设备的支持吗?此外,如果3D sprite渲染在每一帧都不断刷新(例如精细旋转),那么连续卸载/重新加载纹理到内存会导致帧速率下降吗?我想有些场景可能会有多达10个这样的3D屏幕外精灵


感谢您的帮助

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

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


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

我想我知道你在说什么。您可能建议使用视口将我的图形约束到主屏幕的特定区域,并在那里渲染3D行星。听起来是个好主意。但是,(每帧)创建视口、将渲染模式更改为“透视”、渲染行星,然后更改视口并切换回“正交”会更昂贵吗?这可能会在每帧中发生多次。看起来,拥有具有自己明确渲染状态的屏幕外缓冲区(FBO)会留下更少的状态更改。切换视口和某些矩阵不会比任何屏幕外缓冲区慢。此外,如果您使用ES1,您甚至不能拥有“它自己的明确渲染状态”,您将不得不在绘制时切换到另一个缓冲区,然后再返回。如果您使用ES2,在这两种情况下,您可以有两个程序,每个程序都有自己的状态。