2012-08-23 28 views
11

Estoy trabajando en la creación de un sombreador para generar el terreno con sombras.Tres js: clonación de un sombreador y cambio de valores uniformes

Mi punto de partida es clonar el sombreador lambert y usar un ShaderMaterial para eventualmente personalizarlo con mi propio script.

El método estándar funciona bien:

var material = new MeshLambertMaterial({map:THREE.ImageUtils.loadTexture('images/texture.jpg')}); 

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

etc 

El resultado: Result with standard lambert material

Sin embargo, me gustaría utilizar el material Lambert como base y el trabajo en la parte superior de la misma, por lo que he intentado esto :

var lambertShader = THREE.ShaderLib['lambert']; 
var uniforms = THREE.UniformsUtils.clone(lambertShader.uniforms); 

var texture = THREE.ImageUtils.loadTexture('images/texture.jpg'); 
uniforms['map'].texture = texture; 

var material = new THREE.ShaderMaterial({ 
    uniforms: uniforms, 
    vertexShader: lambertShader.vertexShader, 
    fragmentShader: lambertShader.fragmentShader, 
    lights:true, 
    fog: true 
}); 

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

El resultado de éste: Result for cloning lambert shader and changing map uniforms

Parece que el sombreador no está teniendo en cuenta la nueva textura que he agregado, sin embargo, mirando al inspector cuando registré los uniformes, el objeto del mapa tiene los valores correctos.

Soy bastante nuevo para tres, así que podría estar haciendo algo fundamentalmente malo, si alguien pudiera indicarme la dirección correcta aquí, sería genial.

¿Puedo también poner enlaces de demostración si eso fuera útil?

Gracias, Will

EDIT:

Estos son algunos enlaces de demostración.

demostración de material de sombreado: http://dev.thinkjam.com/experiments/threejs/terrain/terrain-shader-material.html

demo con material de trabajo Lambert: http://dev.thinkjam.com/experiments/threejs/terrain/terrain-lambert-material.html

+0

Sí, los enlaces de demostración serían de gran ayuda. – mrdoob

+0

Hola mrdoob, aplausos por la respuesta rápida. Agregué enlaces de demostración a la publicación. Si puede arrojar algo de luz sobre esto, sería increíble – WillDonohoe

+0

He notado alguna funcionalidad dentro del procesador webgl específico de TRES.MeshLambertMaterial que no ocurre con THREE.ShaderMaterial. Particularmente con uniformes refrescantes. https://github.com/mrdoob/three.js/blob/master/src/renderers/WebGLRenderer.js#L4858 Esto es solo una puñalada en la oscuridad aquí, pero es esto algo que podría estar causando problemas ? – WillDonohoe

Respuesta

8

La razón esto no funciona es el valor predeterminado Three.js Lambert sombreado utiliza el preprocesador macro Directiva #ifdef para determinar si se use mapas, envmaps, lightmaps, etc. etc.

El Three.js WebGLRenderer establece las directivas apropiadas del preprocesador (#define) para habilitar estas piezas de los sombreadores en función de si existen ciertas propiedades en el material objeto.

Si está decidido a realizar la clonación de & modificando los sombreadores predeterminados, tendrá que establecer propiedades relevantes en el material. Para los mapas de textura, la Three.js WebGLRenderer.js tiene esta línea:

parameters.map ? "#define USE_MAP" : "" 

Así que trate de establecer material.map = true; para su material de sombreado.

Por supuesto, si sabe que va a escribir su propio sombreador y no necesita la inclusión dinámica de varios fragmentos de sombreador, puede simplemente escribir el sombreador explícitamente y no tendrá que preocuparse por esta.

+1

¡Gracias @fuzic! – WillDonohoe

Cuestiones relacionadas