WebGL中纹理的最大数量是多少?

9

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

我的问题是,这个8的限制是全局的还是每个着色器/程序都有自己的限制?

如果它是每个着色器/程序的限制,那么这是否意味着,一旦我将纹理加载到一个着色器的uniform中,我可以开始重复使用这些插槽来供其他着色器使用?比如我在一个形状中使用了TEXTURE0,我可以在另一个形状中也使用TEXTURE0吗?

1个回答

20

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

此外,“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个纹理。


这是否意味着我需要在每个绘制调用之间切换纹理,而不是预先上传纹理。这带来了另一个问题,我需要为每个绘制调用上传uniforms(除了纹理之外的其他内容)吗?这些uniforms会持久上传到程序中吗? - Qiaosen Huang
如果一个绘制调用使用与上一个绘制调用不同的纹理,则是的,在绘制调用之间必须重新绑定纹理。关于非纹理uniform的问题似乎是一个单独的问题,建议发表一个新的问题来专注于此。 - emackey
截至2023年,有一个非常有用的网站提供了WebGL和WebGPU采用情况的统计数据:https://web3dsurvey.com/。该网站包含了有关限制和扩展支持的统计数据。例如:https://web3dsurvey.com/webgl2/parameters/MAX_COMBINED_TEXTURE_IMAGE_UNITS显示16个纹理单元的`MAX_COMBINED_TEXTURE_IMAGE_UNITS`的采用率为100%,这也是在WebGL报告中看到的最低保证值(因此是96%的WebGL采用率的100%)。 此外,该网站还指出,在实际应用中,32个纹理单元可以安全地假设为最低支持,支持率为99.97%,但只有28.92%的应用支持48个纹理单元,因此需要动态查询。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接