我特别想知道如果我使用gl.R32F
和gl.RGB32F
会实际分配多少纹理内存? GPU会继续为每个像素分配4个通道吗?特别是gl_FragColor
始终是vec4
。
答案 0 :(得分:1)
纹理需要多少内存是不确定的。由司机决定。驱动程序可以将R32F存储为RGBA32F,也可以将RGB8存储为RGBA8。它可能有各种限制,要求它填充行。例如,要求16字节或128字节对齐要求,以便1x10像素R8扩展为128x10字节。其他驱动程序可能需要将图像划分为正方形,每个正方形具有最小或固定的大小,例如,每个正方形要求为16x16像素,因此12x10纹理实际上占用16x16的空间,而25x10纹理实际占用32x16的空间。
实际上没有办法确切知道纹理将使用多少空间。我知道做所有这些事情的驱动程序。
来自the spec
internalformat是一个符号常量,指示GL应使用哪种格式和最低精度来存储值。
注意短语“最低精度”。
规范中的其他地方
每个纹理组件的内存分配由GL分配,以匹配或超过表3.13-3.14中列出的分配。
表3.13和3.14列出了每个通道的最小大小(以位为单位)。
由驾驶员决定存储东西的实际方式。
作为示例,我希望大多数台式机GPU将RGB5_A1
存储为RGBA8
,而移动GPU实际上可能在硬件本身中支持RGB5_A1
,因此将其保留为{ {1}}。我怀疑对于每通道少于8位的所有格式都是如此。