为什么iPhone上的纹理图像需要具有二维幂?

时间:2008-10-18 05:06:40

标签: iphone

我正在尝试解决iphone上的这个闪烁问题(开放式游戏)。我有一些没有2维度的图像。我将用适当尺寸的图像替换它们......但为什么尺寸必须是2的幂?

6 个答案:

答案 0 :(得分:28)

大多数系统(甚至许多现代显卡)需要2次幂纹理的原因是mipmapping。

什么是mipmapping?

将创建较小版本的图像,以便在非常小的尺寸下正确显示图像。图像被反复划分为2以制作新图像。

所以,想象一下256x128的图像。这将创建尺寸为128x64,64x32,32x16,16x8,8x4,4x2,2x1和1x1的较小版本。

如果此图像为256x192,那么在你达到4x3的尺寸之前它会正常工作。下一个较小的图像将是2x1.5,这显然不是有效的大小。有些图形硬件可以解决这个问题,但很多类型都不能。

某些硬件也需要方形图像,但这不再常见了。

为什么需要mipmapping?

想象一下,你有一张非常遥远的照片,距离只有4像素的大小。现在,当绘制每个像素时,将选择图像上的位置作为该像素的颜色。因此,您最终会得到4个像素,这些像素可能完全不能代表整个图像。

现在,想象一下这幅画正在移动。每次绘制新帧时,都会选择一个新像素。因为图像很远,所以很可能会看到非常不同的颜色,以适应运动中的微小变化。这会导致非常难看的闪烁。

缺少mipmapping会导致任何尺寸小于纹理尺寸的问题,但是当图像被绘制到非常少量的像素时,它会发出最明显的效果。

使用mipmap,硬件可以访问2x2版本的纹理,因此它上面的每个像素都是图像象限的平均颜色。这消除了奇怪的颜色闪烁。

http://en.wikipedia.org/wiki/Mipmap

编辑给那些不再这样说的人: 确实,许多现代GPU可以支持非二次幂纹理,但许多人不能这样做。

事实上,就在上周,我正在使用的XNA应用程序中有一个1024x768的纹理,并且在一台只有一年左右的笔记本电脑上导致游戏负载崩溃。它在大多数机器上运行良好。可以肯定的是,iPhone的gpu比完整的PC gpu简单得多。

答案 1 :(得分:2)

通常,图形硬件本身使用2维幂的纹理。我不确定导致这种情况的实现/构造细节,但它通常是无处不在。

编辑:通过一些研究,结果证明我的知识有点过时 - 现在很多现代显卡都可以处理任意纹理尺寸。我认为,由于手机图形处理器的空间限制,他们可能需要省略任何需要额外芯片的东西。

答案 2 :(得分:2)

  1. 您可以在此处找到有关Apple Ipod / Iphone设备的OpenGL ES支持信息: Apple OpenES support
  2. OpenGL ES 2.0被定义为等于OpenGL 2.0
  3. 关于纹理大小的约束仅从版本2.0消失 因此,如果您使用版本低于2.0的OpenGL ES - 这是正常情况。

答案 3 :(得分:1)

我认为在图形硬件中采用2次幂纹理是非常不错的优化。我买了一台带有最新笔记本电脑图形硬件的新笔记本电脑,如果Maya中的纹理不是2的强度,那么渲染就会搞砸了。

答案 4 :(得分:1)

您使用PVRTC压缩吗?这需要2和方形图像的幂。

答案 5 :(得分:0)

尝试在软件中实现包裹纹理映射,您将很快发现为什么需要2的幂大小。

简而言之,你会发现如果你可以假设2维幂,那么很多整数乘法和除法就会变成位移。

我猜想最近放松这种限制的趋势是由于GPU转向浮点数学。

编辑:“因为mipmapping”答案不正确。 Mipmapped,非2次幂纹理是现代GPU的常见功能。