Я работаю над созданием шейдера для создания ландшафта с тенями.
Моя начальная точка - клонировать шейдер lambert и использовать ShaderMaterial, чтобы в конечном итоге настроить его со своим собственным script.
Стандартный метод работает хорошо:
var material = new MeshLambertMaterial({map:THREE.ImageUtils.loadTexture('images/texture.jpg')});
var mesh = new THREE.Mesh(geometry, material);
etc
Результат:
Однако я хотел бы использовать материал lambert в качестве основы и работать над ним, поэтому я попробовал это:
var lambertShader = THREE.ShaderLib['lambert'];
var uniforms = THREE.UniformsUtils.clone(lambertShader.uniforms);
var texture = THREE.ImageUtils.loadTexture('images/texture.jpg');
uniforms['map'].texture = texture;
var material = new THREE.ShaderMaterial({
uniforms: uniforms,
vertexShader: lambertShader.vertexShader,
fragmentShader: lambertShader.fragmentShader,
lights:true,
fog: true
});
var mesh = new THREE.Mesh(geometry, material);
Результат для этого:
Похоже, что шейдер не учитывает новую текстуру, которую я добавил, однако, глядя на инспектора, когда я регистрировал униформу, объект карты имеет правильные значения.
Я новичок в трех, поэтому я мог бы сделать что-то принципиально неправильное, если бы кто-то мог указать мне в правильном направлении здесь, это было бы здорово.
Я также могу разместить демонстрационные ссылки, если это было бы полезно?
Спасибо, Будет ли
EDIT:
Вот несколько демонстрационных ссылок.
Демо с шейдерным материалом: http://dev.thinkjam.com/experiments/threejs/terrain/terrain-shader-material.html
Демо с рабочим материалом lambert: http://dev.thinkjam.com/experiments/threejs/terrain/terrain-lambert-material.html