是否可以使用 WebGL 最大纹理大小?

Is it possible to use WebGL max texture size?

我正在开发一款分辨率越高越好的应用程序。

但我被 WebGL max_texture_size 问题困住了。我创建了一个尺寸正好是这个尺寸的图像(在我的笔记本电脑上是 16384x16384),WebGL 崩溃说:

GL_INVALID_ENUM : glBindFramebuffer: target was GL_READ_FRAMEBUFFER_ANGLE GL_INVALID_ENUM : glBindFramebuffer: target was GL_READ_FRAMEBUFFER_ANGLE WebGL: CONTEXT_LOST_WEBGL: loseContext: context lost

当我尝试使用最大值的 0.75 时,也会发生同样的情况。仅在最大分辨率的一半下工作,但这意味着我的图形内存中仅使用了 1/4 的像素!

所以我的问题是是否可以使用最大纹理大小,如果不能,如何找到 WebGL 可以吃的最大纹理?我在网上发现很少(如果有的话)关于这个的文档。

以防万一,这是我绑定纹理的方式:

gl.activeTexture(glTexture);
texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
with(gl){
    texParameteri(TEXTURE_2D, TEXTURE_MAG_FILTER, LINEAR);
    texParameteri(TEXTURE_2D, TEXTURE_MIN_FILTER, NEAREST);
    texParameteri(TEXTURE_2D, TEXTURE_WRAP_S, CLAMP_TO_EDGE);
    texParameteri(TEXTURE_2D, TEXTURE_WRAP_T, CLAMP_TO_EDGE);
}
program.samplerUniform = gl.getUniformLocation(program, textureName);
gl.uniform1i(program.samplerUniform, textureNb);

gl.getParameter(gl.MAX_TEXTURE_SIZE) returns GPU 可以处理的最大维度。换句话说,你可以制作一个 1xMAXMAXx1 纹理,如果你有内存,它应该一直工作到 MAXxMAX

另一方面,你不能制作 (MAX+1)x1 因为 MAX+1 是 > MAX.

但是,MAXxMAX,好吧,在你的情况下

16384 * 16384 * 4 (RGBA) * UNSIGNED_BYTE = 1073741824 or 1GIG!!!

你的 GPU 有 1Gig 吗?事实上,它需要超过 1Gig,因为它正在为 OS 和 Chrome 本身以及 mips 和其他任何东西使用内存。也许更好的例子

16384 * 16384 * 4 (RGBA) * FLOAT = 4294967296 or 4GIG!!!

即使您的 GPU 有很多内存,浏览器也可能会限制您可以访问的内存量。很可能您的浏览器 运行 内存不足,这就是它崩溃的原因。

至于知道任何设备的限制,可以说没有办法知道。首先,除了 Chrome(其他浏览器认为这是一个隐私问题)之外,您无法检查用户机器具有哪个 GPU。其次,您不知道他们的机器上还有什么 运行 占用内存。