是否可以强制在WebGL中完全加载模型?

是否可以强制在WebGL中完全加载模型?,webgl,Webgl,我正在加载一堆obj模型,它们相当重,每个都有120多个纹理。它们加载精细并最终渲染,但当它们第一次绘制时,帧速率在地板上下降,对象的材质在加载纹理之前显示为黑色 是否有办法确保模型及其纹理在显示之前已完全加载,或者至少查询它们是否已准备好绘制? 还有,有没有办法鼓励加载纹理?在绘制对象之前,它们似乎不会加载 谢谢 基本上,只需检查每个帧加载了多少纹理,当它们最终加载时,您就可以开始绘图了。WebGL对模型一无所知,所以很难说问题出在哪里。我使用的加载程序是OBJMTLLoader,然后使用MT

我正在加载一堆obj模型,它们相当重,每个都有120多个纹理。它们加载精细并最终渲染,但当它们第一次绘制时,帧速率在地板上下降,对象的材质在加载纹理之前显示为黑色

是否有办法确保模型及其纹理在显示之前已完全加载,或者至少查询它们是否已准备好绘制? 还有,有没有办法鼓励加载纹理?在绘制对象之前,它们似乎不会加载

谢谢


基本上,只需检查每个帧加载了多少纹理,当它们最终加载时,您就可以开始绘图了。

WebGL对模型一无所知,所以很难说问题出在哪里。我使用的加载程序是OBJMTLLoader,然后使用MTLLoader加载引用的材质和纹理。有几个级别的回调加载,看起来没有任何东西可以像您所描述的那样跟踪纹理的数量。我将研究添加代码来管理它。ThanksWell,无论哪个加载程序,它都有一些来自图像对象的
onload
的回调,因此需要定位并以某种方式包括在检查是否所有纹理都准备好了中。这个答案说明了一般原则。祝你好运因此,我花了一些时间对此进行深入研究。我发现以下线索表明,最近对加载纹理的监视有了一些爱好:果然,在MTLLoader加载所有纹理之后,GPU上只有几个纹理。然后,当我在屏幕上移动我的对象时,它们都被添加了。我查看了MTLLoader代码,结果发现所有的纹理实际上都很快加载到内存中。然后我使用Ben Vaniks WebGL inspector检查纹理何时加载到GPU上。我很高兴在Threejs的渲染代码中弄脏了我的手,所以如果有人能给我一个将纹理发送到GPU的起点,那就太好了。再次感谢。
var images = [/*..image list...*/];
var loaded = [];
var numReady = 0;

for(var i= images.length-1; i>=0; i--) {
    loaded[i] = new Image();
    loaded[i].src = images[i];
    loaded[i].onload = function() {
        numReady++;
    };
}

// in render loop
if(numReady==images.length) {
    //now ready to render
}