调用gl.texImage2D时在内存分配方面会发生什么?

时间:2018-08-30 15:23:42

标签: webgl2

我特别想知道如果我使用gl.R32Fgl.RGB32F会实际分配多少纹理内存? GPU会继续为每个像素分配4个通道吗?特别是gl_FragColor始终是vec4

1 个答案:

答案 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位的所有格式都是如此。