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



我正在努力解决iphone上的这个闪烁问题(打开gl-es游戏)。我有一些图像没有2维幂。我将用合适尺寸的图像替换它们。。。但为什么维度必须是二次幂呢?

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

什么是mipmapping

将创建较小版本的图像,以使图像在非常小的尺寸下看起来正确。将图像一次又一次地除以2以生成新图像。

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

如果这张图片是256x192,在你缩小到4x3的尺寸之前,它会一直正常工作。下一个较小的图像将是2x1.5,这显然不是一个有效的大小。一些图形硬件可以处理这个问题,但许多类型的硬件不能。

一些硬件也需要方形图像,但这种情况已经不常见了。

为什么需要mipmapping

想象一下,你有一张非常遥远的照片,那么遥远,只有4个像素大小。现在,当绘制每个像素时,图像上的一个位置将被选择为该像素的颜色。因此,最终得到的4个像素可能根本不能代表整个图像。

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

缺少mipmapping会导致任何小于纹理大小的大小出现问题,但当图像缩小到非常小的像素数时,问题最为明显。

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

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

编辑那些说这不再是真的人:的确,许多现代GPU可以支持两种纹理的非幂,但也确实有许多GPU不能。

事实上,就在上周,我正在开发的XNA应用程序中有一个1024x768的纹理,它导致一台只有一年左右历史的笔记本电脑在加载游戏时崩溃。不过它在大多数机器上运行良好。可以肯定的是,iPhone的gpu比全电脑的gpu要简单得多。

通常,图形硬件与2维幂的纹理一起原生工作。我不确定导致这种情况的实现/构建细节,但通常情况下,它无处不在。

编辑:经过一点研究,我的知识有点过时了——现在很多现代显卡都可以处理任意纹理大小。我可以想象,由于手机图形处理器的空间限制,他们可能需要省略任何需要额外硅的东西。

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

我认为在图形硬件中采用2次幂的纹理是一个相当不错的优化。我买了一台新笔记本电脑,配备了最新的笔记本电脑图形硬件,如果纹理在Maya中不是2次方,渲染就会一团糟。

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

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

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

我大胆猜测,最近放宽这一限制的趋势是由于GPU转向浮点数学。

编辑:"因为mipmapping"的答案不正确。Mipmapped,两个纹理的非幂是现代GPU的一个常见特征。

最新更新