Android / 离屏渲染到纹理

3
我正在制作一个显示行星的2D图形应用程序。我之所以说是2D,是因为大多数应用程序都是2D。然而,我想将一些3D对象渲染成动态精灵(到纹理),具有透明(可能半透明)区域,并随后将这些渲染纹理呈现为2D纹理四边形。在这种情况下,直接在屏幕上呈现3D对象并不是最佳选择,因为这将要求我实现某种3D拾取。我的数学水平还不够高。请注意,主屏幕呈现将是正交的,而离屏呈现将是透视的。
我该如何实现这个(一般思路,无需细节),最有效的方法是什么?这会减少对各种设备的支持吗?此外,如果3D精灵呈现每帧都不断刷新(例如旋转),是否会因为不断加载/卸载纹理而导致帧率下降?我想某些场景可能会有多达10个这样的3D离屏精灵。
谢谢您的帮助。
1个回答

2
如果您确实需要使用屏幕外渲染,只需搜索FBO(帧缓冲对象)并将纹理附加到其中,然后在主视图中将纹理用作2D即可。这是一个非常简单的过程,但可能会降低速度。您可能无法对其进行任何多线程处理,因此应仅创建1个FBO。它的尺寸可能必须是2的幂,因此分辨率可能与您所希望的不同。此过程不会持续加载/卸载任何内容,数据在创建纹理时分配,GL直接从中绘制/读取。这里最大的缺点将是内存..您将创建多达10个这样的纹理来绘制并呈现一次。
尽管如此,在您的主缓冲区上特定位置放置这些对象可能非常容易:将所有逻辑都设为要绘制全屏行星,但使用“视口”方法将其放置到屏幕的特定部分。
如果这些行星图像仅在用户请求时更新(您不想每帧都绘制它们),那么建议您尝试将两者结合起来:创建一个FBO,并使用“视口”方法将所有行星绘制到该单个纹理中,其大小与主视图相同或更大。然后,您可以更新任何您想要的内容,只需不清除缓冲区,而是在缓冲区/纹理的特定部分上绘制一个清除矩形。并继续将整个纹理绘制到主缓冲区中。

我想我知道你在这里说什么。你可能建议使用视口将我的绘图限制在主屏幕的特定区域,并在那里渲染3D星球。这听起来像个好主意。但是,每帧都创建视口,将渲染模式更改为透视图,渲染行星,然后将视口切换回来并切换回正交视图,这样会更昂贵吗?这可能每秒发生几次。似乎具有其自身明确渲染状态的离屏缓冲区(FBO)将留下较少的状态更改。 - user2255673
绝不可能将视口和某些矩阵切换比任何离屏缓冲区慢。此外,如果您使用ES1,甚至不能拥有“自己的明确渲染状态”,您必须在绘制到另一个缓冲区时进行切换,然后再切回来。如果您使用ES2,则可以在两种情况下每种都有2个程序,每个程序都有自己的状态。 - Matic Oblak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接