你能按特定顺序加载纹理吗?

时间:2013-07-18 21:58:43

标签: javascript three.js webgl

我正在为球体几何体的每个球体面加载不同的纹理,并且此刻它从上到下加载纹理。无论如何都要开始加载纹理,比如球体的中间并继续向外?

仅供参考,我正在为每个球面分配纹理

var sphere  = new THREE.SphereGeometry( 250, geo_width, geo_height );   

var materials = []; 
for( var y = 0; y < geo_height; y++ ){
    for( var x = 0; x < geo_width; x++ ){
        materials.push( loadTexture('getImage.php?x=' + x + '&y=' + y + '&zoom=2&type=' + type ) );
    }   
}   

for( var i = 0; i < sphere.faces.length; i++ ){
    sphere.faces[ i ].materialIndex = i;
}   

1 个答案:

答案 0 :(得分:1)

是的,你可以这样做。 首先,您应该按照要显示的顺序开始加载纹理。在您的情况下,您需要更改循环,首先加载位于球体中间的纹理。

var materials = new Array(geo_height*geo_width);
// loading middle part of textures
for( var y = yFrom; y < yTo; y++ ){
    for( var x = xFrom; x < xTo; x++ ){
        materials[y * geo_width + x] = loadTexture('getImage.php?x=' + x + '&y=' + y + '&zoom=2&type=' + type );
    }
}
// loading other textures
for( var y = 0; y < geo_height; y++ ){
    for( var x = 0; x < geo_width; x++ ){
        if (materials[y * geo_width + x] == undefined)
            materials[y * geo_width + x] = loadTexture('getImage.php?x=' + x + '&y=' + y + '&zoom=2&type=' + type );
    }
}

有时,如果您想确保某些纹理在其他纹理之前加载,您可以使用加载回调函数来同步它们。为此,请使用Imageutils.loadTexture(url,mapping,onLoad,onError)。例如,按包装载纹理:

function loadTexturesPack(texturesPack, cb) {
    var count = 0,
        textures = [],
        onLoad = function() {
            count++;
            if (count == texturesPack.length) 
                cb(textures);
        };
    for (var i = 0; i < texturesPack.length; i++) {
        textures.push(Imageutils.loadTexture(texturesPack.url, null, onLoad));        
    }
}

function loadPacks(packs) {
    var i = 0;
        onLoad = function(textures) {
            i++;   
            // do something with loaded textures  
            // ...      
            // load next texture pack 
            if (i < packs.length) {
                loadTexturesPack(pack[i]);
            }
        };
    loadTexturesPack(pack[0]);
}