【问题标题】:Max number of textures in WebGL?WebGL 中的最大纹理数量?
【发布时间】:2021-05-17 21:20:36
【问题描述】:

我知道 WebGL 中有 8 个纹理的限制。

我的问题是,8 是全局限制,还是每个着色器/程序明智?

如果它是每个着色器/程序明智的限制,这是否意味着,一旦我将纹理加载到一个着色器的制服,我就可以开始将这些插槽重用于其他着色器?假设我将TEXTURE0 用于一个形状,我可以将TEXTURE0 用于另一个形状吗?

【问题讨论】:

    标签: webgl


    【解决方案1】:

    限制是每次绘制调用。当您进行绘制调用并调用特定着色器程序时,您会受到限制,但您的下一次绘制调用可以在同一动画帧中使用完全不同的纹理。

    此外,8 只是最低保证。系统需要支持至少八个才能被视为符合 WebGL。但更好的图形卡支持超过八个。您可以像这样查询您所在平台的最大图像纹理数:

    var maxTextures = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);
    

    您还可以查找顶点纹理:

    gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS)
    

    或两者的结合:

    gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS)
    

    您还可以使用WebGL Report 之类的网站(免责声明,我是贡献者)来查找您所在平台的此统计信息(在片段着色器 -> 最大纹理单元下)。

    编辑:第一次编写此答案时,还有另一个名为“WebGL Stats”的有用站点,该站点将显示各种浏览器中 WebGL 支持的聚合数据。可悲的是,该网站几年前在没有任何警告的情况下消失了。但即使在那个时候,大多数设备至少支持 16 种纹理。

    【讨论】:

    • 我的意思是我需要在每次绘制调用之间切换纹理,而不是提前上传纹理。这带来了另一个问题,我是否需要为每个绘图调用上传制服(除了纹理之外的其他东西)?上传到程序的制服是否保留?
    • 如果绘图调用使用的纹理与之前的绘图调用不同,那么是的,您必须在绘图调用之间重新绑定纹理。关于非纹理制服的问题听起来像是一个单独的问题,也许可以发布一个新的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多