you/how 可以使用大于 MAX_TEXTURE_SIZE 的纹理吗?
Can you/how to use textures that are larger than MAX_TEXTURE_SIZE?
我在服务器上生成了一个 1536 x 47616 像素的 PNG 文件。 PNG 是调色板,有 20 个条目。 PNG 的大小为 2.5MB - 我不明白为什么内存对 GPU 来说是个问题。
这个大图像文件基本上包含了很多小纹理的组合。这个大文件中的每个纹理都是 128px 宽 x 512px 高。这意味着基本上这个大图像包含 3*372 = 1116 张图像(每行 1536/512 = 3 张图像,每列 47616/128 = 372 张)
我将它们放在同一张图片中,否则最终用户将需要分别请求 1116 张图片,并且需要请求和处理 headers - 要处理的图片很多。请求单个海量图像的速度要快得多。
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 范围。
那么现在,我可以在客户端上引用图像的较小部分吗?也许用大 this.texture_image
图片 object 制作我自己的小图片 object?
我想我可以使用 Canvas 和 drawImage,但更喜欢基于 WebGL 的解决方案。因为我稍后会用 WebGL 对它做一些其他的效果。
谢谢。
The size of the PNG is 2.5MB - i dont see why memory can be an issue
for the GPU
PNG 是一种未针对随机实时访问进行优化的压缩文件格式,GPU 不支持此类编码,不使用任何扩展 GPU 仅支持原始像素数据,因此您的图像将扩展为 WIDTHxHEIGHTx4 => 1536x47616x4 = 292552704 字节,这是一个巨大的 292.553 兆字节,即使使用扩展,您也会被固定宽度的块编码方案所束缚。话虽这么说 MAX_TEXTURE_SIZE
与其说是关于内存,不如说是它的可寻址性,没有办法解决这个问题(在 WebGL 中),你唯一的选择是使用 2D canvas 将你的纹理图集分成合适的块。
我在服务器上生成了一个 1536 x 47616 像素的 PNG 文件。 PNG 是调色板,有 20 个条目。 PNG 的大小为 2.5MB - 我不明白为什么内存对 GPU 来说是个问题。
这个大图像文件基本上包含了很多小纹理的组合。这个大文件中的每个纹理都是 128px 宽 x 512px 高。这意味着基本上这个大图像包含 3*372 = 1116 张图像(每行 1536/512 = 3 张图像,每列 47616/128 = 372 张)
我将它们放在同一张图片中,否则最终用户将需要分别请求 1116 张图片,并且需要请求和处理 headers - 要处理的图片很多。请求单个海量图像的速度要快得多。
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 范围。
那么现在,我可以在客户端上引用图像的较小部分吗?也许用大 this.texture_image
图片 object 制作我自己的小图片 object?
我想我可以使用 Canvas 和 drawImage,但更喜欢基于 WebGL 的解决方案。因为我稍后会用 WebGL 对它做一些其他的效果。
谢谢。
The size of the PNG is 2.5MB - i dont see why memory can be an issue for the GPU
PNG 是一种未针对随机实时访问进行优化的压缩文件格式,GPU 不支持此类编码,不使用任何扩展 GPU 仅支持原始像素数据,因此您的图像将扩展为 WIDTHxHEIGHTx4 => 1536x47616x4 = 292552704 字节,这是一个巨大的 292.553 兆字节,即使使用扩展,您也会被固定宽度的块编码方案所束缚。话虽这么说 MAX_TEXTURE_SIZE
与其说是关于内存,不如说是它的可寻址性,没有办法解决这个问题(在 WebGL 中),你唯一的选择是使用 2D canvas 将你的纹理图集分成合适的块。