WebGL 中的 texImage2D 需要多少数据?
How much data does texImage2D in WebGL need?
我在 ThreeJS 中创建了一个 DataTexture,它会依次调用 texImage2D。
var twidth = 50;
var theight = 50;
var tsize = twidth * theight;
var tileData = new Uint8Array( tsize * 3);
//fill it with some data
tileDataTexture = new THREE.DataTexture(this.tileData, twidth, theight, THREE.RGBFormat);
如您所见,我使用了 50x50 Texel 大小和三个 8 位通道(THREE.RGB in threejs)。当我使用大小为 7500 (50*50*3) 的 UInt8Array 时,Firefox 告诉我它需要更多数据:
Error: WebGL: texImage2D: not enough data for operation (need 7598, have 7500)
我想知道:这额外的98字节是从哪里来的?我猜对齐,但 7598 甚至不能被 4 整除,而 7500 是。 (现在想来,我的频道数也不能被3整除)
7600 是有意义的,因为这意味着每行填充 2 字节,最后一行没有填充吗?
(我知道尺寸应该只使用四的倍数,但我还是想知道答案)
除最后一行外,行长度与 4 的倍数对齐。在您的情况下,这意味着每行需要 2 个字节的填充,每行总共 152 个字节(3 * 50 + 2
)。
152 * (50 - 1) + 3 * 50 = 7598
如需参考,请参阅 source code of Gecko。
正如 user1421750 指出的那样,行已填充
但是,您可以通过设置 texture.unpackAlignment
来设置每行的填充量。它默认为 4,但您可以将其设置为 8、4、2 或 1。
就我个人而言,我会将默认值设置为 1,因为我认为您不太可能像以前那样感到惊讶
我在 ThreeJS 中创建了一个 DataTexture,它会依次调用 texImage2D。
var twidth = 50;
var theight = 50;
var tsize = twidth * theight;
var tileData = new Uint8Array( tsize * 3);
//fill it with some data
tileDataTexture = new THREE.DataTexture(this.tileData, twidth, theight, THREE.RGBFormat);
如您所见,我使用了 50x50 Texel 大小和三个 8 位通道(THREE.RGB in threejs)。当我使用大小为 7500 (50*50*3) 的 UInt8Array 时,Firefox 告诉我它需要更多数据:
Error: WebGL: texImage2D: not enough data for operation (need 7598, have 7500)
我想知道:这额外的98字节是从哪里来的?我猜对齐,但 7598 甚至不能被 4 整除,而 7500 是。 (现在想来,我的频道数也不能被3整除)
7600 是有意义的,因为这意味着每行填充 2 字节,最后一行没有填充吗?
(我知道尺寸应该只使用四的倍数,但我还是想知道答案)
除最后一行外,行长度与 4 的倍数对齐。在您的情况下,这意味着每行需要 2 个字节的填充,每行总共 152 个字节(3 * 50 + 2
)。
152 * (50 - 1) + 3 * 50 = 7598
如需参考,请参阅 source code of Gecko。
正如 user1421750 指出的那样,行已填充
但是,您可以通过设置 texture.unpackAlignment
来设置每行的填充量。它默认为 4,但您可以将其设置为 8、4、2 或 1。
就我个人而言,我会将默认值设置为 1,因为我认为您不太可能像以前那样感到惊讶