2015-04-30 84 views
4

我正在研究更高分辨率总是更好的应用程序。是否可以使用WebGL max纹理大小?

但我坚持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:上下文丢失

而当我用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); 

回答

13

gl.getParameter(gl.MAX_TEXTURE_SIZE)返回最大尺寸的GPU能够解决。换句话说,您可以制作1xMAXMAXx1纹理,如果您有内存,它应该一直工作到MAXxMAX

另一方面,您不能使(MAX+1)x1,因为MAX+1是>MAX

但是,MAXxMAX,好了,你的情况

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

请问您的GPU有1G的?事实上,它需要超过1Gig,因为它使用的是操作系统和Chrome本身的内存以及mips等等。也许更好的例子

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

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

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

+0

好的,谢谢,我错过了这个最大值的含义。这实际上是有道理的。但我应该如何去寻找适合内存的最大纹理尺寸(有一定的余量)我猜标签是在沙箱中运行的,并且无法猜测它们的可用内存? – mrudelle

+0

即使它们未在沙箱中运行,您如何知道它们没有在每个选项卡中使用WebGL应用程序打开的50个选项卡?除了分配逐渐变大的纹理和祈祷之外,我确实没有办法知道。如果你正在制作一个应用程序,尽量使用尽可能少的内存/合理的内存。你可能会看到'navigator.platform'猜测一点,至少移动与桌面。否则,请考虑为用户提供喜欢大多数PC游戏的细节与低细节的选项。 – gman

+1

对不起,但我认为这可能是一个错误。从Khronos规范: “对于1D和2D纹理(以及任何使用类似维度的纹理类型,如立方图),其最大尺寸为E_MAX_TEXTURE_SIZE。” – Jackalope