我知道在WebGL中有8个纹理的限制。
我的问题是,这个8的限制是全局的还是每个着色器/程序都有自己的限制?
如果它是每个着色器/程序的限制,那么这是否意味着,一旦我将纹理加载到一个着色器的uniform中,我可以开始重复使用这些插槽来供其他着色器使用?比如我在一个形状中使用了TEXTURE0
,我可以在另一个形状中也使用TEXTURE0
吗?
我知道在WebGL中有8个纹理的限制。
我的问题是,这个8的限制是全局的还是每个着色器/程序都有自己的限制?
如果它是每个着色器/程序的限制,那么这是否意味着,一旦我将纹理加载到一个着色器的uniform中,我可以开始重复使用这些插槽来供其他着色器使用?比如我在一个形状中使用了TEXTURE0
,我可以在另一个形状中也使用TEXTURE0
吗?
每个绘制调用的纹理数量受到限制。 当你进行一个绘制调用并调用一个特定的着色器程序时,你受到这个限制,但是在同一动画帧中的下一个绘制调用可以使用完全不同的纹理。
此外,“8”只是最小保证。 系统需要支持至少八个才能被认为是符合WebGL规范的。 但是更好的显卡支持超过8个。 您可以像这样查询平台上图像纹理的最大数量:
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个纹理。