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
Funktioniert es, wenn Sie die Textur von Anfang an dem Material hinzufügen, sodass das erste Rendering des Gitters die Textur enthält? – WestLangley
@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
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