【问题标题】:Is it possible to use WebGL max texture size?是否可以使用 WebGL 最大纹理大小?
【发布时间】:2016-12-22 17:47:58
【问题描述】:

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

但我遇到了 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:looseContext:上下文丢失

当我尝试使用 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);

【问题讨论】:

    标签: javascript browser textures webgl


    【解决方案1】:

    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 有 1Gig 吗?事实上,它需要超过 1Gig,因为它正在为操作系统和 Chrome 本身以及 mips 和其他任何东西使用内存。也许更好的例子

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

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

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

    【讨论】:

    • 好的,谢谢,我误解了这个最大值的含义。现在这实际上是有道理的。但是我应该如何找到适合内存的最大纹理大小(有一些边距)我猜标签是在沙箱中运行并且无法猜测它们的可用内存?
    • 即使它们没有在沙箱中运行,你怎么知道它们没有打开 50 个标签,每个标签中都有一个 WebGL 应用程序?除了分配逐渐变大的纹理并祈祷之外,我真的没有其他方法。如果您正在制作应用程序,请尝试使用尽可能少/合理的内存。您可能可以查看navigator.platform 来猜测一下,至少是移动设备与桌面设备。否则,请考虑像大多数 PC 游戏一样为用户提供高细节与低细节的选项。
    • 抱歉,我认为这可能是一个错误。来自 Khronos 规范:“对于 1D 和 2D 纹理(以及使用类似维度的任何纹理类型,如立方体贴图),任一维度的最大尺寸为 GL_MAX_TEXTURE_SIZE。”
    • 有什么错误? GL_MAX_TEXTURE_SIZE 只是一个常量,您可以通过在 OpenGL 中调用 glGetIntegerv 进行查询,如 GLint maxTextureSize; gl.getIntergerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize); 或在 WebGL 中为 var maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); 如上所述,许多 GPU 返回 16384 作为其最大大小。 16384*16384*4 浮点数(浮点纹理)将是 4Gig。许多 GPU 甚至没有 4G 内存
    • 对不起,如果我不清楚。 MAX_TEXTURE_SIZE 是 GPU 可以处理的最大 维度。这与它是否适合记忆无关。所以是的 IF 你有足够的内存可以制作 MAXxMAX(祝贺你的 8GIG GPU)。许多移动 GPU 返回 MAX=16836,但没有 16384x16384xRGBAxFLOAT 纹理所需的 4GIG 内存。但是,无论你有多少内存,你都无法制作(MAX+1)x1 纹理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    相关资源
    最近更新 更多