Tôi đang cố gắng để xác định một vật liệu để meshes tôi nạp từ OBJLoader thông qua chức năng wrapper sau:Ba JS Bản đồ Chất liệu gây WebGL Cảnh báo
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);
}
Khi kết cấu đã được nạp và đó là thời gian để áp dụng các nguyên liệu vào lưới, tôi bắt đầu nhận được cảnh báo sau trên bảng điều khiển:
.WebGLRenderingContext: GL ERROR :GL_INVALID_OPERATION : glDrawElements: attempt to access out of range vertices in attribute 0
và bản thân lưới biến mất.
Tôi đang làm gì sai ở đây?
CẬP NHẬT
Như @WestLangley chỉ trên nhận xét: Không bao giờ cố gắng áp dụng kết cấu/vật liệu sau khi mọi thứ đã được trả lại. Tạo những tài liệu trước khi vẽ các đối tượng đến hiện trường và sau đó thay đổi chúng bằng cách sử:
obj.material.map = texture
Tính năng này có hoạt động không nếu bạn thêm kết cấu vào tài liệu ngay từ đầu, do đó kết xuất đầu tiên của lưới bao gồm kết cấu? – WestLangley
@WestLangley Một kết cấu được áp dụng khi lưới được nạp và trước khi nó được thêm vào cảnh và đó là khi nó không thành công. Khi tôi thử sử dụng "child.material.map = texture" Tôi không nhận được cảnh báo WebGL, nhưng kết cấu không được áp dụng. Vì lý do gì đó, "child.material = new THREE.MeshLambertMaterial ({color: 0xdddddd, shading: BA.FlatShading, map: texture});" áp dụng texture khi thay đổi renderer từ WebGL thành Canvas. Toàn bộ mã tại đây: https://gist.github.com/jrmoretti/81047c9d6821e4bbaac5 – JayMoretti
Trong WebGLRenderer, bạn không thể thêm họa tiết sau khi thực tế. Bạn chỉ có thể thay đổi kết cấu. Một công việc xung quanh là để bắt đầu với một vật liệu với một kết cấu màu trắng đơn giản. – WestLangley