2013-05-01 87 views
1

我想用Three.js的normalmap着色器渲染一个位移贴图的球体。我也在我的场景中使用PointLight。Three.js normalmap位移光

问题是我无法让我的位移球体正确点亮。实际上,如果我省略纹理,则球体全部为黑色且具有正常贴图着色器材质,但使用简单的meshLambertMaterial时,它会正确点亮。 (见下图)

我试图用normalmap /位移着色器和meshLambertMaterial做一个多物质网格,但结果并不确定。

我是否在创建着色器材质时发生了错误(请参阅下面的代码)?

var specularColor = 0xcccccc; 
var diffuseColor = 0xffffff; 
var ambiantColor = 0x888888; 

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

uniforms["enableAO"].value = 0; 
uniforms["enableDiffuse"].value = 1; 
uniforms["enableSpecular"].value = 1; 
uniforms["enableReflection"].value = 0; 
uniforms["enableDisplacement"].value = 1; 
uniforms["tNormal"].value = normalTexture; 
uniforms["tSpecular"].value = specularTexture; 
uniforms["uNormalScale"].value = 1.0; 
uniforms["tDisplacement"].value = heightTexture; 
uniforms["uDisplacementScale"].value = 5; 
uniforms["uDiffuseColor"].value.setHex(diffuseColor); 
uniforms["uSpecularColor"].value.setHex(specularColor); 
uniforms["uAmbientColor"].value.setHex(ambiantColor); 
uniforms["uShininess"].value = 1; 

var parameters = { 
    fragmentShader : shader.fragmentShader, 
    vertexShader : shader.vertexShader, 
    uniforms : uniforms, 
    lights : true 
}; 
var material = new THREE.ShaderMaterial(parameters); 
var geometry = new THREE.SphereGeometry(radius, 100, 100); 
geometry.computeTangents(); 

var mesh = new THREE.Mesh(geometry, material); 

enter image description here enter image description here

回答

2

一件事显然是错误的。它应该是

uniforms[ "uNormalScale" ].value.set(1.0, 1.0); 

three.js所r.58

+1

良好的渔获,我在移民从R50到R58错过了这个,谢谢。 – Typedef 2013-05-01 17:21:27