Я играю с Three.js во время моего обеденного перерыва, реализуя старые демоверсии NEHE (до № 30 до сих пор). Одним из аспектов, который кажется раздражающим, являются новые асинхронные загрузчики текстур. У меня есть шейдер материала демо, где материал будет создаваться так:synch vs. asynch texture loading in three.js
var uniforms = {
tOne: { type: "t", value: THREE.ImageUtils.loadTexture("images/cover.png") },
tSec: { type: "t", value: THREE.ImageUtils.loadTexture("images/grass.png") }
};
var material_shh = new THREE.ShaderMaterial({
uniforms: uniforms,
vertexShader: vertShader,
fragmentShader: fragShader
});
var mesh = new THREE.Mesh(cubeGeom, material_shh);
gfxScene.add(mesh);
Это прекрасно работает, но three.js скулит у меня в консоли, которая осуждается LoadTexture. (Зачем?). Во всяком случае, я могу написать его использовать textureLoader так:
var textureLoader = new THREE.TextureLoader();
var cover, grass;
textureLoader.load("images/cover.png", function(texture) {
cover = texture;
});
textureLoader.load("images/grass.png", function(texture) {
grass = texture;
var uniforms = {
tOne: { type: "t", value: cover },
tSec: { type: "t", value: grass }
};
var material_shh = new THREE.ShaderMaterial({
uniforms: uniforms,
vertexShader: vertShader,
fragmentShader: fragShader
});
var mesh = new THREE.Mesh(cubeGeom, material_shh);
gfxScene.add(mesh);
});
Это тоже работает, но кажется довольно запутанным. Я получаю, что асинч хорош для веб-приложений и т. Д., Но ... И он предполагает, что мне гарантировано, что cover.png будет загружен до grass.png. На самом деле это гарантировано? Я предпочел бы просто использовать синхронную утилиту loadTexture, но, возможно, есть веская причина не использовать loadTexture (кроме устаревшего). ТИА.
Вы можете загрузить все необходимые вам ресурсы, используя 'THREE.LoadingManager()', и, когда все будет готово, вызовите функцию анимации. – prisoner849