OpenGL:为什么正方形纹理占用更少的内存

9
问题: 为什么相同数量的像素,如果存储在正方形纹理中,所需的视频内存要比存储在长方形纹理中少得多?
例子: 我使用glTexImage2D命令创建了360个4x16384大小的纹理。内部格式为GL_RGBA。 视频内存:1328 MB。 如果我使用相同的数据创建360个256x256纹理,则内存使用量少于100MB。 使用集成的Intel HD4000 GPU。

我不是100%确定,但我认为这与OpenGL如何处理像素数据有关,特别是它们的glTexture调用。当图像是正方形时,我认为这与在后备缓冲区中存储数据以准备渲染时使用2的幂有关。 - Francis Cugler
你是否正在生成mipmaps?我认为你没有,但只是为了确认一下 ;) - Mars
@Mars:你说得对,我忘了说明我没有使用mipmaps。 - Szak1
根据您的建议,答案可能是与实现相关的,但从论坛上看,人们普遍认为只要纹理的尺寸是2的幂次方,非正方形纹理就没有性能缺陷。 - Szak1
最简单的方法是在配备专用GPU的不同硬件上尝试它。你在测试使用哪个版本的OpenGL?4.0? - Mars
@Mars。是的,OpenGL 4.0。一旦我拿到了专用GPU并进行测试后,我会及时更新。 - Szak1
1个回答

9

这并不是关于纹理呈矩形的质地,而是其中一个维度非常小。

为了以最佳方式从纹理中选择像素,硬件将采用所谓的重组技术。一般的想法是重新构造纹理中的字节,使在二维中相邻的像素在内存中也是相邻的。但是这样做需要纹理在两个维度上都具有一定的最小尺寸。

现在,纹理过滤硬件可以忽略这个最小尺寸,并且只从纹理实际大小内的像素中提取。但是这额外的存储仍然存在,没有任何有用的目的。

根据您所看到的情况,Intel的重组硬件基本最小尺寸可能为32或64个像素。

在OpenGL中,除了您在此处所做的操作之外,您几乎无法检测到这种不协调。


5
谢谢,作为一个OpenGL新手,我不知道swizzling。的确,将每个纹理的大小从4x16384增加到32x16384并没有增加内存使用量(第一次增加发生在64x16384)。这表明,正如您所建议的那样,Intel芯片组的OpenGL实现为每个方向分配了至少32个像素。我已将您的答案标记为解决方案。 - Szak1
1
难道没有像NSight这样的工具可以检测到吗? - cmourglia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接