我正在开发一款更高分辨率的应用。
但是我遇到了WebGL max_texture_size问题。我创建了一个大小正好这个尺寸的图像(我的笔记本电脑上的16384x16384)和WebGL崩溃说:
GL_INVALID_ENUM:glBindFramebuffer:目标是GL_READ_FRAMEBUFFER_ANGLE GL_INVALID_ENUM:glBindFramebuffer:目标是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);
答案 0 :(得分:14)
gl.getParameter(gl.MAX_TEXTURE_SIZE)
会返回GPU可以解决的最大维度。换句话说,您可以制作1xMAX
或MAXx1
纹理,如果您有内存,它应该一直工作到MAXxMAX
。
另一方面,由于(MAX+1)x1
是>,您无法MAX+1
。 MAX
。
但是,MAXxMAX
,嗯,在你的情况下
16384 * 16384 * 4 (RGBA) * UNSIGNED_BYTE = 1073741824 or 1GIG!!!
你的GPU有1Gig吗?实际上它需要超过1Gig,因为它使用内存用于操作系统和Chrome本身以及mips和其他任何东西。也许更好的例子
16384 * 16384 * 4 (RGBA) * FLOAT = 4294967296 or 4GIG!!!
即使您的GPU拥有大量内存,浏览器也可能会限制您可以访问的内存量。很可能你的浏览器内存不足,这就是崩溃的原因。
至于了解任何设备的限制,可以说没有办法知道这一点。首先,除了Chrome(其他浏览器认为是隐私问题)之外,您无法检查用户机器上的GPU。其次,你不知道他们的机器上还有什么在运行并占用内存。