我试图在WebGL中渲染一辆汽车的车牌,它的颜色是紫色的,其统一的名字是diffTex
。
当我用一种简单的黑色材料和没有纹理的
diffTex
和36到specNrmMap
的6 activeTexture()
calls。紫色平板如预期般在屏幕上显示。
然而,当我用自己的材料、纹理等渲染整辆汽车时,呈现车牌的绘图调用跳过了,并将统一的35与specNrmMap
绑定到specNrmMap
,没有第36号,用于5次activeTexture()
调用。紫色板呈白色,没有漫射纹理。--
WebGL是否有一个统一的限制或纹理绑定的限制,我可能会忽略?webglreport.com声明我的最大纹理图像单位是16在片段着色器,我只使用6,所以我有10个备用。我不会改变车牌材料中的任何东西,它只是当我把汽车渲染成没有纹理的黑色的时候,当我用纹理渲染其余的汽车时,它就停止工作了。
发布于 2021-01-06 11:15:42
制服在WebGL中没有编号。调试器中的数字是由调试器分配的。如何对它们进行编号取决于调试器。它可以通过查询它们来计算它们的数量。如果是这样的话,它们会在不同的实现中得到不同的数字。如果你改变着色器,它们也会改变。它可以根据你使用它们的顺序给它们编号。如果是这样的话,那么设置不同的纹理也会给它们编号不同。
如果不使用制服,几乎总是会对制服进行优化,所以如果您停止使用特定的制服,那么您使用的调试器可能会对它们进行不同的编号。
至于限制,正如您已经检查过的那样,纹理单元的数量是有限制的,并且您可以将不同的纹理绑定到每个单元,因此您的6个纹理很好地低于这个限制。
对于制服,极限是通过gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS)
查询顶点着色器和gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS)
,尽管你不太可能达到这个限制,因为你在编译着色器时会出错。
注意:你能从这个数字中实际使用多少制服是由包装算法定义的。请参阅this answer
至于为什么您的代码不能工作,您必须发布一个回购(在问题本身),我们才能弄清楚。
https://stackoverflow.com/questions/65590826
复制相似问题