2017-07-09 1 views
0

Ich habe mir eine allgemein verständliche Frage über das Fragment und den Vertex-Shader gestellt.Einige grundlegende Fragen zu den Shadern (Vertex- und Fragment Shader) von Three.js

Wir haben in der Vorlesung gelernt, dass es nicht möglich/zumindest sehr schwer ist, Transparenz in den benutzerdefinierten Shadern von Tree.js zu berechnen und zu verwenden.

Hier ist die Frage: Kann mir jemand erklären, warum das der Fall ist und wie man etwas mit den Shadern transparent machen kann (wie der "normale" Transparenzparameter bei Material, wo man einfach sagen kann: transpareny: true).

+0

Sie sollten es vermeiden, mehrere Fragen gleichzeitig zu stellen, da dies die Wahrscheinlichkeit verringert, eine Antwort zu erhalten. Man müsste die Lösung für alle Fragen kennen, um eine Antwort zu schreiben. – BDL

+0

Vielleicht können Sie uns auch den Grund nennen, warum der Vortragende gesagt hat, dass es sehr schwierig ist, Transparenz in Shadern zu verwenden. Es ist nicht so schwer AFAIK – 2pha

+0

ich stimme zu, die Weitergabe einzelner Float Transparenz Wert an den Fragment-Shader über Uniform ist nicht so schwer – DanP

Antwort

0

Es hängt davon ab, was Sie und der Dozent mit "Transparenz" meint. Was folgt, ist zur Verdeutlichung sehr vereinfacht.

Der erste Teil von transparenten Objekten ist die Tiefensortierung. Wenn Sie ein three.js-Material erstellen, ermöglicht material.transparent = true; die Tiefensortierung, bei der Szenenobjekte auf der Grundlage der Tiefe der Kamera in die Renderreihenfolge und nicht in der Reihenfolge, in der sie hinzugefügt wurden, platziert werden. Dies stellt sicher, dass die transparenten Objekte ihre Farben korrekt mischen. Das war wahrscheinlich, was der Dozent sagen wollte, war im Shader schwer zu machen, weil sich der Shader auf das Zeichnen des aktuellen Fragments konzentriert und nicht viel Information über die umgebende Szene hat.

Der zweite Teil der Transparenz - mit der Sie wahrscheinlich vertrauter sind - ist die Einstellung eines Deckkraftwerts für das Material. Wenn Sie in einem beliebigen Fragment-Shader suchen, wird als letztes die Farbe des Fragments festgelegt, bei der es sich um eine vec4 handelt.

gl_FragColor = something; 

Der vierte Wert des vec4 ist die alpha (Opazität) -Wert. Sie könnten manuell ein Fragment Halb tranparent rot wie folgt festgelegt:

gl_FragColor = vec4(1.0, 0.0, 0.0, 0.5); 

Aber noch einmal, wenn das Objekt nicht richtig Tiefen sortiert ist, kann die Transparenz nicht funktionieren, wie Sie es erwarten.

In Bezug auf Ihre Frage, wie Werte an den Shader übergeben werden, stimme ich den obigen Kommentaren zu: Ihre zweite Frage sollte in einen separaten Beitrag aufgeteilt werden.

Das heißt, uniform s, attribute s, und varying s sind allgemeine und grundlegende Typ-Qualifier in Shadern. Jeder hat sehr spezifische Anwendungen, und es klingt, als ob Sie den Unterschied nicht ganz verstehen (das ist in Ordnung, Sie lernen immer noch). Ich empfehle, ein wenig mehr darüber zu lesen, wie man jeden von ihnen richtig verwendet (und StackOverflow ist natürlich ein guter Platz für Antworten like this one).

+0

Kudos zum Verständnis der Frage :) – pailhead

+0

hey, Entschuldigung für die späte Antwort. Ich habe die Frage wie empfohlen abgebrochen. Damit ich es richtig verstehe: Wenn ja, benutze ja three.js Material und erstelle ein Mesh mit Transparenz und einigen Opazitätswerten, wird die Szene korrekt wiedergegeben, weil eine fullautomatische Deepth-Sortierung läuft? Das kann nicht durch die Shader auf ihrem Weg getan werden, eher müssen Sie das tun? –

+0

Korrigieren. Transparente Objekte werden nach ihrer Position im 3D-Raum sortiert. Dies ist am einfachsten außerhalb des Shaders möglich. Szene = Formen & Objekte, Shader = Fragmente. Eines Tages wird WebGL 2.0 über [compute shaders] (https://www.khronos.org/opengl/wiki/Compute_Shader) verfügen, das die Sortierung schneller als ein JavaScript-Thread durchführen kann. Aber jetzt ist dein Verständnis richtig. – TheJim01

Verwandte Themen