【发布时间】:2021-05-17 21:20:36
【问题描述】:
我知道 WebGL 中有 8 个纹理的限制。
我的问题是,8 是全局限制,还是每个着色器/程序明智?
如果它是每个着色器/程序明智的限制,这是否意味着,一旦我将纹理加载到一个着色器的制服,我就可以开始将这些插槽重用于其他着色器?假设我将TEXTURE0 用于一个形状,我可以将TEXTURE0 用于另一个形状吗?
【问题讨论】:
标签: webgl
我知道 WebGL 中有 8 个纹理的限制。
我的问题是,8 是全局限制,还是每个着色器/程序明智?
如果它是每个着色器/程序明智的限制,这是否意味着,一旦我将纹理加载到一个着色器的制服,我就可以开始将这些插槽重用于其他着色器?假设我将TEXTURE0 用于一个形状,我可以将TEXTURE0 用于另一个形状吗?
【问题讨论】:
标签: webgl
限制是每次绘制调用。当您进行绘制调用并调用特定着色器程序时,您会受到限制,但您的下一次绘制调用可以在同一动画帧中使用完全不同的纹理。
此外,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 种纹理。
【讨论】: