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

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

我们将使用正射投影。

首先想到的是在世界大小创build一个大的4顶点矩形,其中背景纹理映射到它,并使用glTranslatef / glScalef翻译/缩放。 但是,我想知道是否屏幕边界之外的不可见区域仍然由OpenGL渲染,因为它没有被剔除(你将失去可见区域以及只有4个顶点)。 因此,细分这个矩形会更有效率吗,所以不可见的小矩形可以被剔除?

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

也许有另一种方式..?

如果有人对如何在“愤怒的小鸟”/“粘粘世界”中做出这样的想法,请分享,因为我很乐意听到。 他们似乎已经实现了一个系统,允许世界移动和放大非常(WorldOfGoo =非常)顺利。

Solutions Collecting From Web of "在OpenGL和细分中滚动/缩放场景"

这可能是您实施的最佳select。

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

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

编辑:从Google I / O 2009中查看本演示文稿的 53:28。

您可以将背景矩形分成更小的矩形,以便OpenGL只渲染可见的矩形。 你将不会有一个大的屁股矩形加载大屁股纹理,但较小的矩形,可以加载/卸载,具体取决于在屏幕上可见的纹理…

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

暂且搁置; 从你说的这个问题的方式,我不确定你是否有一个大的背景纹理或一个小的重复。 如果它很大,那么由于纹理尺寸的限制,你将需要细分,所以问题是没有意义的! 如果它很小,那么我会build议第二种方法,在屏幕上安装一个四边形,然后通过改变纹理坐标来移动背景。

不过,我觉得我可能错过了一些东西,因为我不确定为什么在谈到纹理坐标方法而不是大四元方法时提到了纹理尺寸限制问题。 当然,这对于重复纹理来说不是问题,因为您可以使用GL_REPEAT纹理自动换行模式。

但是对于一个单一的大纹理来说,这两个都是一个问题,除非你细分,这会使纹理坐标战术的方式变得比必要的复杂。 在这种情况下,沿着纹理细分网格细分将是最好的,并剔除屏幕外的部分。 用这种技术决定哪些部分剔除应该是微不足道的。

干杯。