我正在努力创建一个着色器来生成带有阴影的地形。
我的出发点是克隆兰伯特着色器并使用 ShaderMaterial 最终用我自己的脚本对其进行自定义。
标准方法效果很好:
var material = new MeshLambertMaterial({map:THREE.ImageUtils.loadTexture('images/texture.jpg')});
var mesh = new THREE.Mesh(geometry, material);
etc
The result:
![Result with standard lambert material](https://i.stack.imgur.com/BTRD1.png)
不过,我想使用兰伯特材料作为基础并在其之上进行工作,所以我尝试了以下方法:
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);
The result for this one:
![Result for cloning lambert shader and changing map uniforms](https://i.stack.imgur.com/I6480.png)
看起来好像着色器没有考虑我添加的新纹理,但是当我记录制服时查看检查器,地图对象具有正确的值。
我对三个还很陌生,所以我可能会做一些根本上错误的事情,如果有人能在这里指出我正确的方向,那就太好了。
我还可以提供演示链接,是否有帮助?
谢谢,
将要
EDIT:
这里有一些演示链接。
使用着色器材质的演示:http://dev.thinkjam.com/experiments/ Threejs/terrain/terrain-shader-material.html http://dev.thinkjam.com/experiments/threejs/terrain/terrain-shader-material.html
使用兰伯特材料进行演示:http://dev.thinkjam.com/experiments/ Threejs/terrain/terrain-lambert-material.html http://dev.thinkjam.com/experiments/threejs/terrain/terrain-lambert-material.html