Я только начинаю изучать Three.js. У меня есть базовый пример webgl. Но теперь, когда я хочу получить аналогичный пример, работающий в среде THREE.js, у меня возникли проблемы с текстурированием.
Текстура загружается с помощью прелоадера createjs.
Я попытался добавить htmlImageElement к документу, чтобы убедиться, что он загружен до создания материала. И это выглядит нормально. Поэтому я не думаю, что моя проблема заключается в создании материала до завершения загрузки текстуры. Как это было проблемой для других.
Также я протестировал текстуру из моего предыдущего примера webgl, и это выдает ту же ошибку, поэтому я не думаю, что используемое изображение недействительно.
Четырехугольник в приведенном ниже примере будет отображаться как синий квадрат, но в тот момент, когда я добавляю свою текстуру к материалу, возникает ошибка. GL_INVALID_OPERATION : glDrawElements: попытка доступа к вершинам вне диапазона в атрибуте 1.
У меня мало опыта работы с Three.js, поэтому я думаю, что проблема в том, как я создаю материал, сцену или геометрию. Хотя у меня действительно закончились идеи.
Я использую TypeScript.
private createPaper(): THREE.Mesh {
var paperGeo = new THREE.Geometry();
paperGeo.vertices.push(new THREE.Vector3(1, 1, 0));
paperGeo.vertices.push(new THREE.Vector3(3, 1, 0));
paperGeo.vertices.push(new THREE.Vector3(3, 3, 0));
paperGeo.vertices.push(new THREE.Vector3(1, 3, 0));
paperGeo.faces.push(new THREE.Face3(0,1,2));
paperGeo.faces.push(new THREE.Face3(2,3,0));
var img: HTMLImageElement = m.getAsset("paper0");
this.paperTex = new THREE.Texture(img, THREE.UVMapping,THREE.ClampToEdgeWrapping, THREE.ClampToEdgeWrapping,
THREE.LinearFilter, THREE.LinearFilter, THREE.RGBAFormat, THREE.UnsignedByteType, 0);
var paperMaterial = new THREE.MeshBasicMaterial({
map:this.paperTex, color: 0x0000dd, side: THREE.DoubleSide
});
var paper = new THREE.Mesh(paperGeo, paperMaterial);
return paper;
}