我在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 Texels和3个8Bit通道的大小(三个中的THREE.RGB)。当我使用尺寸为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个字节,最后一行是不填充的?
(我觉得那个尺寸应该只使用四个倍数,我仍然想知道答案)
答案 0 :(得分:2)
行长度与4的倍数对齐,最后一行除外。在您的情况下,这意味着每行需要2个字节的填充,每行总共152个字节(3 * 50 + 2
)。
152 * (50 - 1) + 3 * 50 = 7598
供参考,请参阅source code of Gecko。
答案 1 :(得分:1)
当user1421750指出行被填充
但是,您可以通过设置texture.unpackAlignment
来设置每行填充多少。它默认为4,但您可以将其设置为8,4,2或1。
就我个人而言,我会默认为1,因为我认为你不会像你一样感到惊讶