2015-06-11 4 views
1

Я создал DataTexture в ThreeJS, который, в свою очередь, вызовет texImage2D.Сколько данных требуется texImage2D в WebGL?

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); 

Как вы можете видеть, я использовал размер 50х50 текселей и трех 8BIT каналов (THREE.RGB в threejs). Когда я использовал UInt8Array размера 7500 (50 * 50 * 3), Firefox говорит мне, что он нуждается в большем количестве данных:

Error: WebGL: texImage2D: not enough data for operation (need 7598, have 7500) 

Я хотел бы знать: где это дополнительные 98 байт взялись? Я бы предположил, что выравнивание, но 7598 даже не делится на 4, а 7500. (Теперь, когда я думаю об этом, он не делится на 3, мое число каналов)

7600 имеет смысл, поскольку это будет означать 2 байта заполнения в строке, последняя строка не заполнена?

(я понимаю, что нужно использовать только кратные четырех размерностей, все-таки я хотел бы знать ответ)

ответ

2

Длина строки выровнены кратными 4, за исключением последней строки. В вашем случае это означает, что каждая строка требует 2 байта заполнения, всего 152 байта (3 * 50 + 2) за строку.

152 * (50 - 1) + 3 * 50 = 7598 

Для справки см. source code of Gecko.

1

Как user1421750 указал строки дополняются

Но, вы можете установить, как много отступов для каждой строки, установив texture.unpackAlignment. он по умолчанию равен 4, но вы можете установить его на 8, 4, 2 или 1.

Лично я бы сделал по умолчанию 1, потому что думаю, что вы вряд ли будете удивлены, как будто вы были

Смежные вопросы