2012-07-02 16 views
5

Sadece aşağıdaki kodla benim sahnede bir küp Normal map Ninja demo uygulamak çalıştı - dev daldan yeni son Three.js sürümünü kullanıyor:THREE.js'de normal bir harita nasıl doğru bir şekilde oluşturulur?

// 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 
); 

Ben, ancak, Chrome'da şu WebGL hata alıyorum :

GL_INVALID_OPERATION : glDrawXXX: attempt to access out of range vertices 

Firefox'ta böyle bir hata alıyorum, ancak küp de görünmüyor. Standart bir MeshLambertMaterial kullanarak her şey iyi çalışıyor. Yani, ShaderMaterial ile bir çakışma olması gerekiyor. MASTER şubesinden en son Three.js sürümünü kullanırsam durumu iyileştirmez - aynı hata oluşur.

Bunun neden olabileceği ve çalışmasını sağlamak için neleri değiştirmem gerektiğini düşündüğüm herhangi bir fikrin var mı?

cevap

4

Bunu eklemeye çalıştı mı?

geometry.computeTangents(); 
+0

Böyle bir gölgelendiricinin ImmediateRenderObject üzerinde hiçbir zaman çalışmayacağı mümkün olabilir mi? Bu benim için makul gibi görünüyor çünkü arabelleklere - dev dalında - besleyebileceğiniz tek bilgi vertex pozisyonları, normlar, UV'ler ve renkler, ancak vertex teğetleri değil. Fakat bunlar normal harita oluşturma için gerekli gibi görünüyor. Bu doğru mu yoksa "normal" gölgelendiriciyi ImmediateRenderObject öğesine uygulamak için bir yol var mı? :) – user1495743

İlgili konular