Three.js: Verwenden Sie einen benutzerdefinierten Vertex Shader mit MeshLambertMaterial?

Erstellt am 2. Dez. 2011  ·  9Kommentare  ·  Quelle: mrdoob/three.js

Hallo, ich versuche eine Art benutzerdefinierten Shader zu erstellen, aber ich möchte nur die Scheitelpunktposition und nicht das Material ändern. MeshLambert hat bereits Licht, Textur und alles, was ich brauche, aber ich ändere den Scheitelpunkt und gebe dem Objekt ein organisches Aussehen.

Kann mir jemand eine Richtung geben?

Vielen Dank !!

Question

Hilfreichster Kommentar

@maurrubio hast du dein Projekt beendet: Augen:

Alle 9 Kommentare

Jemand?

Am einfachsten wäre es, benutzerdefinierte ShaderMaterial zu erstellen, die wie Lambert aussehen, und einfach Ihren benutzerdefinierten Code zum Vertex-Shader hinzuzufügen.

Intern verwenden Standardmaterialien genau die gleichen Maschinen wie ShaderMaterial, sodass Sie nur Code von hier kopieren und einfügen müssen:

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

Hallo @alteredq, danke für die Antwort.

Darauf haben Sie sich bezogen?
http://www.interactiveuniverse.net/Shaders.js

Ich erstelle Objekte aus den Arrays, die im Lambert-Shader bereitgestellt werden, und übergebe sie an eine neue ShaderMaterial-Instanz.

Dabei bekomme ich nur ein schwarzes Material, ohne von Punktlichtern beeinflusst zu werden.

Fast dort ;)

Damit Funktionen aus Standardmaterialien in ShaderMaterial funktionieren, müssen Sie auch Materialflags (Lichter, Nebel usw.) setzen:

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

Es funktionierte !!! Vielen Dank, wenn ich meine Arbeit beendet habe, werde ich sie mit euch teilen.

Nur eine letzte Frage @alteredq Der Zweck war, eine Umgebungskarte im Objekt zu verwenden, damit ich ihr eine Textur geben kann. Wie soll ich diese Art von Funktion implementieren, die MeshLambertMaterial enthält?

Hmmm. Ich denke, es sollte ausreichen, um die richtige Uniform festzulegen ( envMap ), und außerdem müssten Sie irgendwo oben auf den Scheitelpunkt- und Fragment-Shadern #define USE_ENVMAP bleiben.

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;",

...

Beachten Sie jedoch, dass beim Ändern der Scheitelpunktpositionen in einem Shader Normalen aus der statischen Geometrie nicht mehr korrekt sind und alles weiterhin gemäß den alten Positionen schattiert wird.

Es hat funktioniert: D.

Ihr seid wirklich erstaunlich und ich weiß, dass Entwickler gerne sehen, was andere Leute mit ihren Werkzeugen machen. Ich hoffe, ich kann mein Projekt bald beenden (Es ist mein persönliches Portfolio und ich verwende Websockets, um Benutzer in einer Weltraumschnittstelle mit Sphären zu verbinden (jedes ist ein anderes Projekt) und Benutzer navigieren durch den Raum und jeder Benutzer ist ein anderes dynamisches Punktlicht, das sich über meine Arbeiten bewegt.

Der Motor ist jetzt ziemlich funktionsfähig. Ich muss mehr daran arbeiten, das Zeug zu entwerfen.

Nochmals vielen Dank!

@maurrubio hast du dein Projekt beendet: Augen:

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen