Three js - клонирование шейдера и изменение унифицированных значений
Я работаю над созданием шейдера для создания ландшафта с тенями.
Моя отправная точка - клонировать шейдер Ламберта и использовать ShaderMaterial, чтобы со временем настроить его с помощью моего собственного скрипта.
Стандартный метод работает хорошо:
var material = new MeshLambertMaterial({map:THREE.ImageUtils.loadTexture('images/texture.jpg')});
var mesh = new THREE.Mesh(geometry, material);
etc
Результат:
Однако я хотел бы использовать материал Ламберта в качестве основы и работать над ним, поэтому я попробовал это:
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);
Результат для этого:
Похоже, что шейдер не принимает во внимание новую текстуру, которую я добавил, однако, глядя на инспектора, когда я регистрировал униформу, объект карты имеет правильные значения.
Я довольно плохо знаком с тремя, так что я мог бы сделать что-то в корне неправильно, если бы кто-то мог указать мне правильное направление здесь, это было бы здорово.
Я также могу разместить демонстрационные ссылки, если это будет полезно?
Спасибо, Будет
РЕДАКТИРОВАТЬ:
Вот несколько демонстрационных ссылок.
Демо с шейдерным материалом:http://dev.thinkjam.com/experiments/threejs/terrain/terrain-shader-material.html
Демо с рабочим материалом Ламберта:http://dev.thinkjam.com/experiments/threejs/terrain/terrain-lambert-material.html