3

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

我怎样才能做到这一点(一般的想法,不需要细节),最有效的方法是什么?这会减少对各种设备的支持吗?此外,如果 3D 精灵渲染在每一帧都不断刷新(例如旋转微调量),是否会通过连续卸载/重新加载纹理到内存来杀死帧速率?我想有些场景可能有多达 10 个这样的 3D 屏幕外精灵。

谢谢您的帮助

4

1 回答 1

2

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

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

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

于 2013-04-08T13:43:30.420 回答