HLSL Translucent Plastic Shader

12

Ich versuche einen Shader zu erstellen, um ein weißes Plastikobjekt mit einem farbigen Licht im Inneren nachzubilden. Entweder durch einen Shader, der durchscheinend ist, und wenn ich ein Licht in das Objekt stecke, wird das Licht durchscheinend sein, oder durch einen Shader, der die Wirkung eines Lichts im Inneren vortäuscht.

Der Effekt, den ich anstrebe, ist ein bisschen wie ein Licht, das durch einen Lampenschirm geht, ähnlich den folgenden Bildern:

Alt-Text Alt-Text Alt-Text

Im Idealfall könnte ich die Stärke und Farbe des Lichts steuern, damit es pulsiert und sich durch einige schöne helle Farben dreht

Obwohl ich nicht sicher bin, wo ich anfangen soll!

Meine Frage ist, ob jemand die Techniken kennt, die ich erforschen sollte, um einen solchen Shader erstellen zu können, oder ein Beispiel für denselben / ähnlichen Shader, den ich als Ausgangspunkt verwenden kann. Oder auch, wenn Sie einen Shader bereitstellen möchten, der die Arbeit erledigt

Tristan
quelle

Antworten:

10

Dies ist ein Effekt, der als "Streuung unter der Oberfläche" bezeichnet wird.

Das Buch "GPU Pro: Advanced Rendering Techniques" enthält ein Beispiel für eine Implementierung dieses Bildschirmbereichs, die für die Verwendung in Echtzeit geeignet ist.

Tony McCrary
quelle
0

Ich kenne HLSL nicht und kann daher keine genaue Antwort geben. Grundsätzlich können Sie die Farbe jedes Fragments in Abhängigkeit von der Entfernung von der Lichtquelle einstellen (Selbstschatten ignorieren).

Im Pseudocode wäre es ungefähr so:

fragment_color = lichtstärke * transparenz_farbe * lichtquellenfarbe / (dämpfung * abstand_zu_lichtquelle ^ 2)

Möglicherweise möchten Sie zusätzlich zum Quadrat einen linearen Dämpfungsfaktor verwenden, damit sich das Licht stärker ausbreitet.

Danik
quelle
0

Muss sich das Licht bewegen können und muss sich das Objekt verformen / animieren können? Wenn beides nicht der Fall ist, besteht eine kostengünstige Möglichkeit darin, eine monochrome Texturabbildung auf das Objekt anzuwenden, das als Maske für das Licht fungiert. Im Shader würden Sie diese Textur abtasten, sie mit der aktuellen Lichtfarbe / -stärke multiplizieren und zur Ausgabefarbe hinzufügen.

Die offensichtliche Folgefrage ist, wie Sie diese Textur erzeugen werden. Sie können versuchen, es zu malen, wenn Sie Zugriff auf einen Künstler haben oder Texturen selbst malen können. Es könnte auch von einem Offline-Tool unter Verwendung von Raytracing oder ähnlichem gerendert werden. Ich bin mit Raytracing-Werkzeugen nicht vertraut genug, um Ihnen genau zu erklären, wie Sie das einrichten sollen.

Ein anderer Ansatz könnte darin bestehen, einen Shader zu schreiben, der das Licht dahinter abtastet, wobei die umgekehrte Flächennormale in der regulären Lambert-Diffusschattierungsgleichung verwendet wird. Dann multiplizieren Sie es mit einem Maskenfaktor von etwa 0,5 und addieren ihn zur Ausgabefarbe. Dies würde das dynamische Bewegen des Lichts oder der Geometrie ermöglichen und keine Texturen erfordern, aber Sie würden wahrscheinlich keine Ergebnisse erhalten, die so gut aussehen wie ein Offline-Render.

Bezüglich der Streuung unter der Oberfläche : Ich glaube nicht, dass genau das hier gewünscht ist, da alle SSS-Algorithmen für Grafiken, die ich gesehen habe, für Licht ausgelegt sind, das von außerhalb der Oberfläche kommt, ein wenig herumprallt und wieder austritt, während das Licht hier drinnen ist .

Nathan Reed
quelle