2013-05-13 4 views
6

Ich versuche, ein Material zu definieren, die ich von OBJLoader durch die folgenden Wrapper-Funktion geladen, um Maschen:Drei JS Kartenmaterial verursacht WebGL Warnung

function applyTexture(src){ 
    var texture = new THREE.Texture(); 
    var loader = new THREE.ImageLoader(); 
    loader.addEventListener('load', function (event) { 
     texture.image = event.content; 
     texture.needsUpdate = true; 

     // find the meshes from the loaded OBJ and apply the texture to it. 
     object.traverse(function (child) { 
      if (child instanceof THREE.Mesh) { 
       if(child.name.indexOf("Lens") < 0){ 
        child.dynamic = true; 

        child.material = new THREE.MeshLambertMaterial({ color: 0xdddddd, shading: THREE.FlatShading, map : texture }); 
        // also tried: 
        //child.material = new THREE.MeshPhongMaterial({ color: 0x000000, specular: 0x666666, emissive: 0x000000, ambient: 0x000000, shininess: 10, shading: THREE.SmoothShading, map : texture}); 
        // and: 
        //child.material = new THREE.MeshBasicMaterial({map : texture}); 
        child.material.map = texture; // won't throw the WebGL Warning, but won't show the texture either; 
       } else { 
        // works just fine. 
        child.material = new THREE.MeshPhongMaterial({ color: 0x000000, specular: 0x666666, emissive: 0x000011, ambient: 0x000000, shininess: 10, shading: THREE.SmoothShading, opacity: 0.6, transparent: true }); 
       } 
      } 
     }); 
    }); 
    loader.load(src); 
} 

Wenn die Textur geladen und es ist Zeit, das Material aufzutragen zu dem Netz, ich bekomme die folgende Warnung auf der Konsole:

und das Netz selbst verschwindet.

was mache ich hier falsch?

UPDATE

Wie @WestLangley auf den Kommentaren darauf: Versuchen Sie nie, Textur/Materialien nach dem Rechten gelten gemacht wurden. Erstellen Sie die Materialien, bevor Sie das Objekt in der Szene zu machen und sie dann ändern mit:

obj.material.map = texture 
+0

Funktioniert es, wenn Sie die Textur von Anfang an dem Material hinzufügen, sodass das erste Rendering des Gitters die Textur enthält? – WestLangley

+0

@WestLangley Eine Textur wird angewendet, wenn das Netz geladen wird und bevor es der Szene hinzugefügt wird und wenn es versagt. Als ich versuchte, "child.material.map = texture" zu verwenden, wurde die WebGL-Warnung nicht angezeigt, aber die Textur wurde nicht angewendet. Aus welchem ​​Grund auch immer, "child.material = new THREE.MeshLambertMaterial ({color: 0xdddddd, Schattierung: THREE.FlatShading, Karte: Textur});" wendet die Textur an, wenn der Renderer von WebGL in Canvas geändert wird. Vollständiger Code hier: https://gist.github.com/jrmoretti/81047c9d6821e4bbaac5 – JayMoretti

+0

Im WebGLRenderer können Sie keine Textur nachträglich hinzufügen. Sie können jedoch nur die Textur ändern. Ein Work-around soll mit einem Material mit einer einfachen weißen Textur beginnen. – WestLangley

Antwort

11

Mit WebGLRenderer, können Sie nicht aus einem Material wechseln, ohne eine Textur, ein Material mit einer Textur, nachdem das Netz gewesen einmal gerendert Dies liegt daran, dass die Geometrie ohne eine anfängliche Textur nicht über die erforderlichen eingebrannten WebGL-UV-Puffer verfügt.

Ein Work-Around soll mit einem Material beginnen, das eine einfache weiße Textur hat.

UPDATE: Alternativ Sie können mit einem textureless Material beginnen und dann die folgenden Flags gesetzt, wenn eine Textur hinzugefügt wird:

material.needsUpdate = true; 
geometry.buffersNeedUpdate = true; 
geometry.uvsNeedUpdate = true; 

three.js r.58

+0

danke. Dieser Trick funktioniert gut. – magirtopcu

2

ich auch bekam Dieser Fehler beim Laden einer Szene aus dem Mixer. Für mich wurde das Problem behoben, wenn ich die UVs für jedes Mesh auspacke, auf dem ich eine Textur haben möchte.

+0

Ja, es passiert einfach beim Zuweisen einer Textur zu einem Modell, das keine Texturkoordinaten hat. Entweder generieren Sie sie in Ihrem Code oder in Ihrem Modellierer. r69 – StackHola