3

嗨,我正在尝试用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 is undefined [Break On This Error]

制服[“正常”].texture = normalMap;

我在网上看了一段时间,不确定需要更改什么语法来解决这个问题。

任何帮助表示赞赏。

4

3 回答 3

5

我认为应该是这样的:

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

对于tDiffuse,也tSpecular一样

于 2013-05-03T04:16:51.857 回答
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;
于 2014-01-09T23:00:36.280 回答
2

我发现在运行您的代码时,在以下行之后:

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

uniforms是一个具有一个成员的对象:不透明度。因此uniforms["tNormal"]还不存在。正如 Olivia 建议的那样,您可以使用以下方法添加这些:

uniforms["tNormal"] = {
    texture: normalMap
};
于 2013-05-03T04:31:33.593 回答