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

mru*_*lle 6 javascript browser textures webgl

我正在开发一个应用程序,其中更高的分辨率总是更好.

但我遇到了WebGL max_texture_size问题.我创建了一个大小正好这个尺寸的图像(我的笔记本电脑上的16384x16384)和WebGL崩溃说:

GL_INVALID_ENUM:glBindFramebuffer:target是GL_READ_FRAMEBUFFER_ANGLE GL_INVALID_ENUM:glBindFramebuffer:target是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);
Run Code Online (Sandbox Code Playgroud)

gma*_*man 17

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!!!
Run Code Online (Sandbox Code Playgroud)

你的GPU有1Gig吗?实际上它需要超过1Gig,因为它使用内存用于操作系统和Chrome本身以及mips和其他任何东西.也许更好的例子

16384 * 16384 * 4 (RGBA) * FLOAT = 4294967296 or 4GIG!!!
Run Code Online (Sandbox Code Playgroud)

即使你的GPU有大量内存,浏览器也可能限制你可以访问的内存量.很可能你的浏览器内存不足,这就是崩溃的原因.

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

  • 对不起,如果我不清楚.MAX_TEXTURE_SIZE是GPU可以解决的最大*维度*.它与是否适合记忆无关.所以是的******你有足够的内存可以制作MAXxMAX(祝贺你的8GIG GPU).大量移动GPU返回MAX = 16836但没有4GIG的RAM需要16384x16384xRGBAxFLOAT纹理.但是,无论你有多少内存,你都无法制作`(MAX + 1)x1`纹理. (4认同)
  • 好的,谢谢,我误解了这个最大值的含义。现在这实际上是有道理的。但是我应该如何找到适合内存的最大纹理大小(有一些余量)我猜选项卡在沙箱中运行并且无法猜测它们的可用内存? (2认同)