2

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

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

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/

这是怎么回事?!

4

2 回答 2

9

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

var shader = THREE.ShaderLib[ "normalmap" ];
于 2013-01-21T19:22:19.203 回答
4

来自 github 存储库:

“如果您使用 libs 文件夹中较旧的 Three.js,则本书的代码有效。从 r50 开始,它要简单得多,只需将地图设置为 MeshPhongMaterial 的属性,如下所示:

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

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

这行得通!

于 2013-10-03T05:02:32.287 回答