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”
Angular 2:TypeError:无法读取未定义的属性“isRouteActive”
WebGL Three.js ColladaLoader 示例失败