在OpenGL和细分中滚动/缩放场景

时间:2012-01-29 23:20:21

标签: android opengl-es scroll zooming

我们将在Android上的OpenGL ES中开发一个滚动/缩放场景,非常像“愤怒的小鸟”中的一个级别,但更像是World of Goo中的级别。更像后者,因为世界不会包含“愤怒的小鸟”中的重复图层,而是一个大图像。由于场景需要滚动/缩放,因此其中很多都不可见,我想知道实现渲染的最有效方法,只关注环境(即不是世界范围内的对象而是背景层)。

我们将使用正投影。

第一个想到的是创建一个世界大小的大4个顶点矩形,其背景纹理映射到它,并使用glTranslatef / glScalef进行平移/缩放。但是,我想知道屏幕边界之外的非可见区域是否仍然由OpenGL渲染,因为它没有被剔除(你将丢失可见区域以及只有4个顶点)。因此,细分这个矩形是否更有效,所以可以剔除不可见的较小的矩形?

另一种选择是创建一个填充屏幕的4个顶点矩形,然后通过调整其纹理坐标来移动背景。但是,考虑到纹理大小的限制,我想在构建更大的世界时会遇到问题。对于像AngryBirds这样的重复背景来说,这似乎是一个很好的实现。

也许有另一种方式......?

如果有人知道如何在AngryBirds / World of Goo中做到这一点,请分享,因为我喜欢听。他们似乎已经实现了一个系统,可以让世界很容易地移动和缩放(WorldOfGoo =非常)。

3 个答案:

答案 0 :(得分:2)

这可能是implementation最好的选择。

根据我的经验,在Android上保留大内存纹理非常昂贵。在移动到平铺之前,我会为背景纹理获得相当多的OutOfMemoryError异常。

我认为最大的渲染瓶颈在于内存传输速度和填充率,而不是任何图形计算。

修改:从Google I / O 2009查看此presentation的53:28。

答案 1 :(得分:0)

您可以将背景矩形拆分为较小的矩形,以便OpenGL仅渲染可见的矩形。你不会有一个加载了大屁股纹理的大屁股矩形,但是你可以加载/卸载的纹理更小的矩形矩形,取决于屏幕上可见的内容......

答案 2 :(得分:0)

Afaik由于大面积在屏幕外渲染而没有性能下降,细分和剔除通常只是为了减少顶点数量,但实际上你会在这里添加它。

暂时放在一边;从你提出问题的方式来看,我不确定你是否有一个大的背景纹理或一个小的重复纹理。如果它很大,那么无论如何你都需要细分纹理尺寸限制,所以这个问题没有实际意义!如果它很小,那么我会建议第二种方法,在屏幕上安装四边形并通过改变纹理坐标来移动背景。

我觉得我可能错过了一些东西,因为我不确定为什么在谈论纹理坐标方法而不是大四元方法时提到纹理大小限制问题。当然,对于这两个都不是重复纹理的问题,因为你可以使用GL_REPEAT纹理包裹模式......

但是对于它们而言 是单个大纹理的问题,除非你细分,这会使纹理坐标策略比必要的更复杂。在这种情况下,沿纹理细分细分网格将是最好的,并剔除屏幕外部分。决定使用这种技术剔除哪些部分应该是微不足道的。

干杯。