У меня есть файл PNG, сгенерированный на сервере, 1536 на 47616 пикселей. PNG имеет палитру и имеет 20 записей. Размер PNG составляет 2,5 МБ - я не понимаю, почему память может быть проблемой для графического процессора.
Этот большой файл изображения в основном содержит комбинацию множества маленьких текстур. Каждая текстура внутри этого большого файла имеет ширину 128px и высоту 512px. Это означает, что в основном это большое изображение содержит 3 * 372 = 1116 изображений (1536/512 = 3 изображения в каждой строке, 47616/128 = 372 в каждом столбце)
Я поместил их в одно и то же изображение, потому что в противном случае конечному пользователю потребуется запросить 1116 изображений отдельно, а с запросом и обработкой заголовков - это много изображений для обработки. Намного быстрее запросить одно большое изображение.
gl.getParameter(gl.MAX_TEXTURE_SIZE); // this gives me 16384 for my browser. My texture's height of 47616 is a lot higher than this.
В настоящее время я пытаюсь привязать текстуру к буферу как:
this.texture_image = new Image();
var parent = this;
this.texture_image.addEventListener("load", function(e) {
parent.tinfo.width = parent.texture_image.width;
parent.tinfo.height = parent.texture_image.height;
parent.gl.bindTexture(parent.gl.TEXTURE_2D, parent.tinfo.texture);
parent.gl.texImage2D(parent.gl.TEXTURE_2D, 0, parent.gl.RGB, parent.gl.RGB, parent.gl.UNSIGNED_BYTE, parent.texture_image);
});
this.texture_image.src= texture_image_url;
Однако это приводит к жалобам в Google Chrome:
main.js:5118 WebGL: INVALID_VALUE: texImage2D: width or height out of range
Что, очевидно, имеет место, поскольку мой рост далеко за пределами диапазона MAX_TEXTURE_SIZE.
Итак, есть ли на клиенте какой-нибудь способ, которым я могу ссылаться на меньшие части изображения? Может быть, сделать мои собственные меньшие объекты Image из большого this.texture_image
объекта Image?
Полагаю, я могу использовать Canvas и drawImage, но предпочел бы решение на основе WebGL. Поскольку я буду делать некоторые другие эффекты с WebGL позже.
Спасибо.