THREE.js - 无法读取未定义的属性'lib'(THREE.ShaderUtils.lib [“normal”])

时间:2013-01-21 19:06:07

标签: javascript three.js webgl

我正在完成Oreilly在WebGL入门书中找到的练习。

以下行导致运行时错误。我用Google搜索,没有看到其他人有问题,所以我做错了什么?

var specularMap= THREE.ImageUtils.loadTexture("WebGLBook/images/earth_specular_2048.jpg");

var shader   = THREE.ShaderUtils.lib[ "normal" ]; <-- fails
var uniforms = THREE.UniformsUtils.clone(shader.uniforms);

uniforms['tNormal'].texture   = normalMap; 
uniforms['tDiffuse'].texture  = surfaceMap;

注意到的行失败,出现以下错误:

Uncaught TypeError: Cannot read property 'lib' of undefined solar-system-spec-map.html:60
Earth.createGlobe solar-system-spec-map.html:60
Earth.init solar-system-spec-map.html:51
EarthApp.init solar-system-spec-map.html:33
(anonymous function) solar-system-spec-map.html:93
deferred.resolveWith jquery-1.6.4.js:1016
jQuery.extend.ready jquery-1.6.4.js:437
DOMContentLoaded

这有点奇怪的是,“ShaderUtils”没有列在THREE.js文档中...... http://mrdoob.github.com/three.js/docs/55/

发生了什么事??

2 个答案:

答案 0 :(得分:9)

命名约定已更改,现在应该可以使用

var shader = THREE.ShaderLib[ "normalmap" ];

答案 1 :(得分:4)

来自github回购:

“如果您在libs文件夹中使用较旧的Three.js,那么本书的代码就可以正常工作。 从r50开始,它更简单,只需将地图设置为MeshPhongMaterial的属性,如下所示:

var material = new THREE.MeshPhongMaterial({
    map: earthSurfaceMap,
    normalMap: earthNormalMap,
    specularMap: earthSpecularMap});

就是这样,不需要制服或computeTangents()。“

这很有用!