我知道 WebGL 中有 8 个纹理的限制。
我的问题是,8 是全局限制还是每个着色器/程序明智的限制?
如果它是每个着色器/程序明智的限制,这是否意味着,一旦我将纹理加载到一个着色器的制服上,我就可以开始将这些插槽重用于其他着色器?假设我将 TEXTURE0
用于一种形状,我可以在另一种形状中使用 TEXTURE0
吗?
最佳答案
限制是每次抽奖。进行绘制调用并调用特定的着色器程序时,您会受到限制的限制,但是下一个绘制调用可以在同一动画帧中使用完全不同的纹理。
同样,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种纹理。