2012-07-02 11 views
5

Sólo traté de aplicar el Normal map Ninja demo a un cubo en mi escena con el siguiente código - usando nueva versión más reciente Three.js de rama dev:¿Cómo hacer un mapa normal en THREE.js correctamente?

// common material parameters 

var ambient = 0x050505, diffuse = 0x331100, specular = 0xffffff, shininess = 10, scale = 23; 

// normal map shader 

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

uniforms[ "enableAO" ].value = true; 
uniforms[ "enableDiffuse" ].value = false; 
uniforms[ "enableSpecular" ].value = false; 
uniforms[ "enableReflection" ].value = true; 

uniforms[ "tNormal" ].texture = THREE.ImageUtils.loadTexture("normal.jpg"); 
uniforms[ "tAO" ].texture = THREE.ImageUtils.loadTexture("ao.jpg"); 

uniforms[ "tDisplacement" ].texture = THREE.ImageUtils.loadTexture("displacement.jpg"); 
uniforms[ "uDisplacementBias" ].value = - 0.428408 * scale; 
uniforms[ "uDisplacementScale" ].value = 2.436143 * scale; 

uniforms[ "uDiffuseColor" ].value.setHex(diffuse); 
uniforms[ "uSpecularColor" ].value.setHex(specular); 
uniforms[ "uAmbientColor" ].value.setHex(ambient); 

uniforms[ "uShininess" ].value = shininess; 

uniforms[ "tCube" ].texture = reflectionCube; 
uniforms[ "uReflectivity" ].value = 0.1; 

uniforms[ "uDiffuseColor" ].value.convertGammaToLinear(); 
uniforms[ "uSpecularColor" ].value.convertGammaToLinear(); 
uniforms[ "uAmbientColor" ].value.convertGammaToLinear(); 


var parameters = { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: uniforms, lights: true, fog: false }; 
var displacementMaterial = new THREE.ShaderMaterial(parameters); 

/* 
var diamond = new THREE.Diamond({ 
    material: bumpmapMaterial 
}); 
*/ 

var diamond = new THREE.Mesh(
    new THREE.CubeGeometry(50, 50, 50), 
    displacementMaterial 
); 

estoy, sin embargo, consiguiendo el error siguiente WebGL en Chrome :

GL_INVALID_OPERATION : glDrawXXX: attempt to access out of range vertices 

En Firefox, no obtengo un error como este, pero el cubo tampoco se muestra. Usando un estándar de color MeshLambertMaterial, todo funciona bien. Por lo tanto, debe haber un conflicto con el ShaderMaterial. Si utilizo la última versión de Three.js de la rama MASTER, no mejora la situación; se produce el mismo error.

¿Alguna idea de por qué este puede ser el caso y lo que necesito cambiar para que funcione?

Respuesta

4

¿Intentó agregar esto?

geometry.computeTangents(); 
+0

¿Será posible, incluso no lógico, que un sombreado como este nunca funcione en un InmediateRenderObject? Esto me parece plausible, porque la única información que puede ingresar en los búferes, en la rama dev, son las posiciones de los vértices, las normales, los UV y los colores, pero no las tangentes de los vértices. Pero esos parecen ser necesarios para la correcta representación del mapa normal. ¿Es correcto o hay una forma de aplicar el sombreador "normal" a un InmediateRenderObject? :) – user1495743

Cuestiones relacionadas