用于着色的Three.js制服

时间:2013-05-03 03:58:36

标签: javascript html5 three.js webgl

您好我正在尝试使用threejs进行简单的着色。我正在使用O'reilly的Up and Running书。

一切都运转良好,直到我尝试这样做:

                var shader = THREE.ShaderLib["normal"];
            var uniforms = THREE.UniformsUtils.clone(shader.uniforms);

            uniforms["tNormal"].texture = normalMap;
            uniforms["tDiffuse"].texture = surfaceMap;
            uniforms["tSpecular"].texture = specularMap;

这一直在抛出这个错误:

TypeError:uniforms.normal未定义 [打破此错误]

制服[“normal”]。texture = normalMap;

我一直在网上寻找一段时间,我不确定需要改变哪种语法来解决这个问题。

感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

我认为应该是这样的:

uniforms["tNormal"] = {
    texture: normalMap
};

tDiffusetSpecular相同。

答案 1 :(得分:2)

我发现在运行代码时,在行之后:

var shader = THREE.ShaderLib["normal"];
var uniforms = THREE.UniformsUtils.clone(shader.uniforms);

制服是一个具有一个成员的对象:不透明度。因此制服[“tNormal”] 尚不存在。正如奥利维亚建议的那样,您可以使用以下方法添加:

uniforms["tNormal"] = {
    texture: normalMap
};

答案 2 :(得分:2)

您的错误和代码不同。错误报告未定义的纹理:

uniforms["normal"].texture = normalMap;

您引用的代码说明您正在使用:

uniforms["tNormal"].texture = normalMap;

我正在研究同一本书的例子,试试这个:

var shader = THREE.ShaderLib[ "normalmap" ];
var uniforms = THREE.UniformsUtils.clone( shader.uniforms );

uniforms[ "tNormal" ].texture = normalMap;
uniforms[ "tDiffuse" ].texture = surfaceMap;
uniforms[ "tSpecular" ].texture = specularMap;

uniforms[ "enableDiffuse" ].value = true;
uniforms[ "enableSpecular" ].value = true;