Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么iPhone上的纹理图像需要具备二维能力?_Iphone - Fatal编程技术网

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

为什么iPhone上的纹理图像需要具备二维能力?,iphone,Iphone,我试图在iphone上解决这个闪烁的问题(OpenGL es游戏)。我有一些没有2维力量的图像。我将用适当尺寸的图像替换它们。。。但是为什么尺寸必须是二的幂呢?通常,图形硬件与纹理以二的幂为本机工作。我不确定导致这种情况的实施/建设细节,但通常情况下,它是如何无处不在的 编辑:通过一些研究,我发现我的知识有点过时了——现在很多现代图形卡可以处理任意大小的纹理。我可以想象,由于手机图形处理器的空间限制,他们可能需要省略任何需要额外硅元素的东西。我认为,在图形硬件中,采用2次幂纹理是一种相当不错的优

我试图在iphone上解决这个闪烁的问题(OpenGL es游戏)。我有一些没有2维力量的图像。我将用适当尺寸的图像替换它们。。。但是为什么尺寸必须是二的幂呢?

通常,图形硬件与纹理以二的幂为本机工作。我不确定导致这种情况的实施/建设细节,但通常情况下,它是如何无处不在的


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

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

大多数系统(甚至许多现代图形卡)需要power-of-2纹理的原因是mipmapping

什么是mipmapping?

将创建更小版本的图像,以使物体在非常小的尺寸下正确显示。图像被2多次分割以生成新图像

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

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

一些硬件也需要方形图像,但这已不再常见

为什么需要mipmapping?

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

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

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

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

对那些说这不再是事实的人进行编辑:
的确,许多现代GPU可以支持两种纹理的非增强功能,但也确实有许多GPU不能


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

尝试在软件中实现包装纹理映射,你会很快发现为什么需要2倍的功率

简言之,您会发现,如果您可以假设2维幂,那么大量整数乘法和除法将变成位移位

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


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

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

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

  • 的确,许多现代GPU可以支持两种纹理的非增强功能,但也确实有许多GPU不能。事实上,就在上周,我正在开发的一款XNA应用程序中出现了一个1024x768纹理,它在一台只有一年历史的笔记本电脑上造成了游戏负载崩溃。那么mipmapping有什么关系呢?与askers问题相关的是,他的硬件不支持mipmapping,所以它只是“不支持”。由此产生的效果是闪烁。另一个选项(尝试处理不支持的图像大小)是崩溃。