Javascript Three.js耗尽纹理单位

Javascript Three.js耗尽纹理单位,javascript,three.js,webgl,Javascript,Three.js,Webgl,我使用Three.js(r73)编写了一个应用程序,允许用户使用ColladLoader加载多个.dae文件 如果用户选择足够数量的对象,纹理将不会为任何对象显示…此时我得到以下结果: WebGLRenderer: trying to use 26 texture units while this GPU supports only 16 该错误消息似乎相当自我解释-这是否意味着我一次只能加载16个纹理?有办法解决这个问题吗?我可以用一半的对象渲染场景吗?清除纹理单元,然后渲染另一半 Thre

我使用Three.js(r73)编写了一个应用程序,允许用户使用ColladLoader加载多个.dae文件

如果用户选择足够数量的对象,纹理将不会为任何对象显示…此时我得到以下结果:

WebGLRenderer: trying to use 26 texture units while this GPU supports only 16
该错误消息似乎相当自我解释-这是否意味着我一次只能加载16个纹理?有办法解决这个问题吗?我可以用一半的对象渲染场景吗?清除纹理单元,然后渲染另一半


Three.js的新功能-如果这是一个愚蠢的问题,那么很抱歉。

这个数字是基于您的GPU支持的,您可以在这里的
最大纹理图像单位:16下看到它

很多人把这个数字和一个场景中可以有多少纹理混淆了,这是错误的。此数字表示可用于单个对象(即在单个绘制调用中)的纹理数

如果你有一个非常复杂的物体,有数百个不同的纹理。您必须找到一种方法将纹理合并在一起,或者将对象拆分为多个可以单独绘制的对象


但是,如果您绘制1000个单独的对象,每个对象具有不同的纹理,这应该不是问题。

警告来自于超过“总”纹理单位的最大数量,而不是顶点纹理单位。请参阅WebGLRenderer.js函数getTextureUnit(),了解其背后的原因以及此错误消息的打印。(例如,第4730行)


为了避免警告,请分析着色器,并减少渲染时着色器中所需的纹理单位数。

@Brendan…谢谢-好信息。不确定您所说的单次绘制调用是什么意思-它与我添加到场景中的每个对象相同。我不会为每个对象调用绘制方法-我猜渲染器会这样做?场景中的每个对象都应该成为单个绘制调用。WebGLRenderer一个接一个地绘制每个对象。@prabindh…好的,谢谢。我需要对我正在加载的对象做更多的分析——我不是自己创建它们的。你知道有没有一种方法可以查询在任何时候有多少个纹理单元可用?也许我可以确定那些有问题的对象。我很好奇,你是如何使用26个纹理单位的?我使用的是其他人提供的collada对象…我想这不会起作用,现在我知道单个对象中的纹理数量是有限制的。@WacławJasper我使用的是其他人提供的collada对象…我想这不会起作用,现在我知道有限制了关于单个对象中纹理的数量。虽然我仍然不相信,因为当我添加多个相同的对象时,这个数字会继续增长,所以我仍然不清楚。问题是,通常情况下,模型使用的纹理不超过4种:漫反射纹理、普通纹理、镜面反射纹理和镜面反射颜色或金属纹理。也许你应该告诉供应商为什么他们需要26种不同的纹理。