如何解决WebGL 是否有统一或纹理绑定限制?
我正在尝试在 WebGL 中使用统一名称为 diffTex
的紫色纹理渲染汽车牌照。
- 当我用简单的黑色材质和无纹理渲染汽车的其余部分时,渲染车牌的 drawcall 将统一 35 绑定到
diffTex
,统一 36 绑定到specNrmMap
,总共 6 {{ 3}}。紫色盘子按预期显示在屏幕上。
- 但是,当我使用自己的材质、纹理等渲染整辆车时,渲染车牌的 drawcall 会跳过
diffTex
,并将统一 35 绑定到specNrmMap
,而没有 #36 为 5总共activeTexture()
次调用。紫色板在没有漫反射纹理的情况下显示为白色。
WebGL 是否有我可能忽略的统一限制或纹理绑定限制? webglreport.com 声明我的最大纹理图像单位在片段着色器中是 16,而我只使用了 6,所以我有 10 个备用。我没有更改车牌材质中的任何内容,它仅在我将汽车渲染为没有纹理的黑色时才起作用,当我用纹理渲染汽车的其余部分时它停止工作。
解决方法
制服在 WebGL 中没有数字。调试器中的那些数字是由调试器分配的。如何编号取决于调试器。它可以通过查询对它们进行编号。如果是这样,他们会在不同的实现中得到不同的数字。如果您更改着色器,它们也会更改。它可以根据您使用它们的顺序对它们进行编号。如果是这样,那么你设置不同的纹理也会给它们不同的编号。
如果不使用制服,它们几乎总是被优化掉,所以如果您停止使用特定的制服,那么您正在使用的调试器可能会再次对它们进行不同的编号。
至于限制,正如您已经检查过的,纹理单元的数量是有限制的,您可以将不同的纹理绑定到每个单元,这样您的 6 个纹理就远远低于限制。
对于制服,通过顶点着色器的 gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS)
和 gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS)
查询限制,尽管您不太可能达到该限制,因为尝试编译着色器时会出错。
注意:您可以从该数字中实际使用多少制服是由打包算法定义的。见this answer
至于为什么您的代码不起作用,您必须发布一个存储库(在问题本身中)让我们弄清楚。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。