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

Posted

技术标签:

【中文标题】THREE.js - 无法读取未定义的属性 \'lib\' (THREE.ShaderUtils.lib["normal"])【英文标题】:THREE.js - Cannot read property 'lib' of undefined (THREE.ShaderUtils.lib["normal"])THREE.js - 无法读取未定义的属性 'lib' (THREE.ShaderUtils.lib["normal"]) 【发布时间】:2013-01-04 21:52:10 【问题描述】:

我正在完成 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/

发生了什么事?!

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

见鬼,我知道它必须是这样的。谢谢你! 我遇到了同样的问题; var 制服 = THREE.UniformsUtils.clone(shader.uniforms);制服['tNormal'].texture = normalMap; .texture 调用失败。这也改变了吗?如果是这样,关于 Three.js 着色器的最新教程在哪里? 在 r55 中 THREE.ShaderUtils.lib[ "normal" ] 被移动到 THREE.ShaderLib[ "normalmap" ] 哦,谢谢你的更新,有什么区别?编辑答案。【参考方案2】:

来自 github 仓库:

“如果您使用 libs 文件夹中较旧的 Three.js,则本书的代码有效。 从 r50 开始,就简单多了,只需将贴图设置为 MeshPhongMaterial 的属性,像这样:

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

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

成功了!

【讨论】:

好东西!谢谢!

以上是关于THREE.js - 无法读取未定义的属性 'lib' (THREE.ShaderUtils.lib["normal"])的主要内容,如果未能解决你的问题,请参考以下文章

Angular5 + Three.js无法读取未定义的属性“Scene1”

Three.JS - 没有皮肤的 DAE 动画

Angular 2:TypeError:无法读取未定义的属性“isRouteActive”

WebGL Three.js ColladaLoader 示例失败

无法读取未定义类型错误的属性“推送”:无法读取未定义错误的属性“推送”

带有 Ionic 4 的 SQLite?无法读取未定义类型错误的属性“then”:无法读取未定义的属性“then”