Three.js: Usando Vertex Shader personalizado com MeshLambertMaterial?

Criado em 2 dez. 2011  ·  9Comentários  ·  Fonte: mrdoob/three.js

Olá, estou tentando fazer algum tipo de shader personalizado, mas só quero modificar a posição do vértice e não o material. O MeshLambert já tem luz, textura e tudo que eu preciso, mas eu modifico o vértice para dar uma aparência orgânica ao objeto.

Alguém pode me dar uma direção?

Obrigado !!

Question

Comentários muito úteis

@maurrubio você terminou seu projeto: olhos:

Todos 9 comentários

Alguém?

O mais fácil seria criar ShaderMaterial customizado que seria como lambert, apenas adicionando seu código customizado ao sombreador de vértice.

Internamente, os materiais padrão usam exatamente o mesmo mecanismo do ShaderMaterial, então você só precisa copiar e colar o código daqui:

https://github.com/mrdoob/three.js/blob/master/src/renderers/WebGLShaders.js#L1187

Olá @alteredq, obrigado por responder.

É a isso que você se referiu?
http://www.interactiveuniverse.net/Shaders.js

Estou criando objetos a partir dos arrays fornecidos no shader lambert e passando-os para uma nova instância de ShaderMaterial.

Fazendo isso, obtenho um material preto sem ser afetado por luzes pontuais.

Quase lá ;)

Para que recursos de materiais padrão funcionem em ShaderMaterial você também precisa definir sinalizadores de material (luzes, neblina, etc):

https://github.com/mrdoob/three.js/blob/master/src/materials/ShaderMaterial.js#L40

shaderMaterial = new THREE.ShaderMaterial( {

    uniforms:       uniforms,
    vertexShader:   vertexShader,
    fragmentShader: fragmentShader,
    lights:         true
    }); 

Funcionou !!! Muito obrigado, quando eu terminar meu trabalho irei compartilhar com vocês.

Só uma última pergunta @alteredq, o propósito de fazer isso também era usar um mapa de ambiente no objeto para que eu pudesse dar a ele uma textura. Como devo implementar esse tipo de recurso que MeshLambertMaterial contém?

Hmmm. Acho que deve ser o suficiente para definir o uniforme adequado ( envMap ) e também você precisaria ficar em algum lugar no topo dos shaders de vértice e fragmento #define USE_ENVMAP .

uniforms[ "envMap" ].texture = myCubeTexture;
vertexShader= [

"#define USE_ENVMAP",

"varying vec3 vLightWeighting;",

THREE.ShaderChunk[ "map_pars_vertex" ],
THREE.ShaderChunk[ "lightmap_pars_vertex" ],

...
fragmentShader = [

"#define USE_ENVMAP",

"uniform float opacity;",

...

Esteja ciente de que se você modificar as posições dos vértices em um sombreador, as normais provenientes da geometria estática não estarão mais corretas e tudo continuará sombreado de acordo com as posições antigas.

Funcionou: D

Vocês são realmente incríveis, e eu sei que os desenvolvedores adoram ver o que outras pessoas fazem com suas ferramentas, espero poder terminar meu projeto em breve (é meu portfólio pessoal e estou usando websockets para conectar usuários em uma interface espacial com esferas (cada um é um projeto diferente) e os usuários navegam pelo espaço e cada usuário é um ponto de luz dinâmico diferente que se move através de minhas obras.

O motor está bastante funcional agora, preciso trabalhar mais no design das coisas.

Obrigado novamente!

@maurrubio você terminou seu projeto: olhos:

Esta página foi útil?
0 / 5 - 0 avaliações