Three.js: Vous utilisez Vertex Shader personnalisé avec MeshLambertMaterial?

Créé le 2 déc. 2011  ·  9Commentaires  ·  Source: mrdoob/three.js

Salut, j'essaie de faire une sorte de shader personnalisé, mais je veux juste modifier la position du sommet et non le matériau. MeshLambert a déjà de la lumière, de la texture et tout ce dont j'ai besoin, mais je modifie le sommet pour donner un aspect organique à l'objet.

Quelqu'un peut me donner une direction?

Merci !!

Question

Commentaire le plus utile

@maurrubio avez-vous terminé votre projet: les yeux:

Tous les 9 commentaires

Quelqu'un?

Le plus simple serait de créer un ShaderMaterial qui ressemblerait à lambert, en ajoutant simplement votre code personnalisé au vertex shader.

En interne, les matériaux standard utilisent exactement les mêmes machines que ShaderMaterial, il vous suffit donc de copier et coller du code à partir d'ici:

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

Salut @alteredq merci d'avoir répondu.

C'est ce à quoi vous avez fait référence?
http://www.interactiveuniverse.net/Shaders.js

Je crée des objets à partir des tableaux fournis dans le shader lambert et je les transmets à une nouvelle instance ShaderMaterial.

En faisant cela, j'obtiens juste un matériau noir sans être affecté par les lumières ponctuelles.

Presque là ;)

Pour que les fonctionnalités des matériaux standard fonctionnent dans ShaderMaterial vous devez également définir des indicateurs de matériaux (lumières, brouillard, 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
    }); 

Ça a marché !!! Merci beaucoup, quand j'aurai fini mon travail, je partagerai avec vous les gars.

Juste une dernière question @alteredq le but de faire cela était également d'utiliser une carte d'environnement dans l'objet afin que je puisse lui donner une texture. Comment je suis supposé implémenter ce genre de fonctionnalité que MeshLambertMaterial contient?

Hmmm. Je pense que cela devrait suffire à définir un uniforme approprié ( envMap ) et que vous auriez également besoin de rester quelque part au sommet des shaders de vertex et de fragment #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;",

...

Sachez simplement que si vous modifiez les positions des sommets dans un shader, les normales provenant de la géométrie statique ne seront plus correctes et tout sera toujours ombré en fonction des anciennes positions.

Cela a fonctionné: D

Vous êtes vraiment incroyables, et je sais que les développeurs aiment voir ce que les autres font avec leurs outils, j'espère pouvoir terminer mon projet bientôt (c'est mon portfólio personnel et j'utilise des websockets pour connecter les utilisateurs dans une interface spatiale avec des sphères (chacun est un projet différent) et les utilisateurs naviguent dans l'espace et chaque utilisateur est une lumière ponctuelle dynamique différente qui se déplace à travers mes œuvres.

Le moteur est assez fonctionnel maintenant, je dois travailler davantage sur la conception du matériel.

Merci encore!

@maurrubio avez-vous terminé votre projet: les yeux:

Cette page vous a été utile?
0 / 5 - 0 notes