我正在尝试解决iphone上的这个闪烁问题(开放式游戏)。我有一些没有2维度的图像。我将用适当尺寸的图像替换它们......但为什么尺寸必须是2的幂?
答案 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)
答案 3 :(得分:1)
我认为在图形硬件中采用2次幂纹理是非常不错的优化。我买了一台带有最新笔记本电脑图形硬件的新笔记本电脑,如果Maya中的纹理不是2的强度,那么渲染就会搞砸了。
答案 4 :(得分:1)
您使用PVRTC压缩吗?这需要2和方形图像的幂。
答案 5 :(得分:0)
尝试在软件中实现包裹纹理映射,您将很快发现为什么需要2的幂大小。
简而言之,你会发现如果你可以假设2维幂,那么很多整数乘法和除法就会变成位移。
我猜想最近放松这种限制的趋势是由于GPU转向浮点数学。
编辑:“因为mipmapping”答案不正确。 Mipmapped,非2次幂纹理是现代GPU的常见功能。