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 !!
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:
Comentários muito úteis
@maurrubio você terminou seu projeto: olhos: