27. März 2021 Tutorial, Blender, PCB, 3D

PCBs rendern (Teil 2) - Shader Setup

Florian Winkler

Als nächstes soll ein Shader für die Platine zusammengestellt werden. Dieser entscheidet anhand der zuvor eingerichteten Texturen, an welchen Stellen Kupfer, Lötstopplack oder Bestückungsdruck sichtbar ist und wie diese verschiedenen Materialien dargestellt werden sollen.

Auf GitHub stellen wir ein Beispielprojekt zur Verfügung. Dort könnt ihr die Blender Dateien herunterladen, welche ein fertiges Setup mit Modell, dazugehörigen Texturen und Shader Einstellungen beinhalten.

Texturen einrichten

Als erstes muss der sogenannte Shader Editor geöffnet werden, damit Änderungen am Material der Platine vorgenommen werden können. Als nächstes können die zuvor importierten Texturen dem Shader der Platine hinzugefügt werden. Die Texturen enthalten Informationen darüber, an welchen Stelle Bestückungsdruck, Lötstopplack oder Kupfer sichtbar sein sollen. Alle Voraussetzungen dafür wurden im Teil 1 beschrieben.

Eine Herausforderung ist nun die Top und Bottom Texturen so miteinander zu verknüpfen, dass die Texturen der Top-Layer nur oben bzw. die Texturen der Bottom-Layer nur unten angezeigt werden. Für die Unterscheidung können die Geometrie Informationen des Mesh der Platine verwendet werden. Die Shader Node Texture Coordinate stellt die Generated Vektor Informationen bereit. Die Vektoren enthalten Werte zwischen 0 und 1 innerhalb der Bounding Box des Körpers. Betrachtet man nur die z-Koordinaten dieser Vektoren, kann man mithilfe der Less Than Node einen Entscheider bauen. Dieser liefert den Wert 0, wenn die z-Koordinaten größer oder gleich 0.5 sind, d. h. von "oben" bis zur Mitte in z-Richtung, bzw. den Wert 1 von der Mitte bis "unten".

Dieser binäre Entscheider dient als Factor einer Mix Node, welche die Top Textur und die Bottom Textur miteinander vermischt. Dabei muss darauf geachtet werden, dass die Texturen eventuell unterschiedliche UV Maps erfordern. Der Screenshot zeigt die beschriebene Anordnung der Shader Nodes und wie die Schwarz-Weiß Texturen auf den 3D Körper abgebildet werden.

Das Zusammenführen der Texturen muss für die anderen zwei Texturpaare auf dieselbe Weise wiederholt werden. Schließlich erhält man durch die Mix Nodes drei Ausgänge, welche für die Entscheidungslogik benötigt werden. Es ist empfehlenswert diese Nodes zu gruppieren. Das finale Setup der Ebenenmasken wird im nachfolgenden Screenshot abgebildet.

Materialien

Eine Platine setzt sich aus verschiedenen Materialien zusammen. In Blender kann so gut wie jedes Material mithilfe des Principled BSDF Shader dargestellt werden. Dieser Shader besitzt eine Vielzahl von Parametern, die entsprechend eingestellt werden müssen. Die Werte, die hier beschrieben werden, dienen als Empfehlung und sind durch herumprobieren entstanden. Das heißt, dass je nach Bedarf diese Parameter auch variiert werden können, um bessere Ergebnisse zu erzielen. Um die Funktionsweise des Principled BSDF Shaders besser zu verstehen, ist das umfangreiche Youtube-Video How to make Photorealistic Materials in Blender, using the Principled Shader von Blender Guru äußerst hilfreich!

In den nachfolgenden Screenshots wurden die einzelnen Materialien in Gruppen zusammengefasst. Dies dient der Übersichtlichkeit, gerade wenn die Materialien am Ende miteinander kombiniert werden (siehe Abschnitt "Materialien kombinieren").

Bestückungsdruck

Das Material des Bestückungsdrucks ist das simpelste. Die Base Color ist fast immer weiß (#FFFFFF) und es muss lediglich der Roughness Parameter angepasst werden.

Principled BSDF Parameter:

  • Roughness: 0.9

Lötstopplack

Der Lötstopplack stellt eine Besonderheit dar. Da dieser durchsichtig ist, sieht der Lack heller aus, wenn sich unter dem Lötstopplack Kupfer befindet. Um dies zu berücksichtigen, eignet es sich mithilfe der Kupfer Texturen die Base Color zu manipulieren. Das heißt, dass man zwei Farben, z. B. ein helles und ein dunkles Blau, über eine Mix Node miteinander vermischt (siehe Screenshot unten).

Da es sich bei diesem Material um Lack handelt, haben wir außerdem mit den Clearcoat Parametern des Principled BSDF Shader herumgespielt, um möglicht realistische Lichtreflexionen zu erhalten.

Principled BSDF Parameter:

  • Base Color: #116CC2 und #053059 (blauer Lötstopplack)
  • Roughness: 0.6
  • Clearcoat: 0.4
  • Clearcoat Roughness: 0.15

Kupfer

Beim Kupfer handelt es sich um die freigestellten Pads der Platine. Hierbei handelt es sich um ein metallisches Material, welches in der Regel silber- oder goldfarben ist aufgrund des verwendeten Oberflächenfinish.

Über den Roughness Parameter kann die Rauheit der Metalloberfläche eingestellt werden. Bei einem Wert von 0.0 handelt es sich um eine perfekte Metalloberfläche, die das Licht vollständig reflektiert - ähnlich wie ein Spiegel. Dies sieht allerdings sehr unrealistisch aus. Aufgrund von Verunreinigungen oder Oxidation ist die Lichtreflexion des Kupfers deutlich diffuser. Wir empfanden einen Wert von 0.4 passend.

Principled BSDF Parameter:

  • Base Color: #FFDF7F (goldfarben) oder #E9ECF2 (silberfarben)
  • Metallic: 1.0
  • Roughness: 0.4
  • Specular Tint: 1.0

Grundmaterial

Das Grundmaterial einer Platine kann man an der Seite sehen. Es besteht aus einem Glasfaser Verbundwerkstoff und ist deshalb leicht transparent. Dafür eignet es sich den Transmission Parameter anzupassen.

Außerdem weißt dieses Material eine schichtenartige Struktur auf. Dies kann in Blender mithilfe einer Checker Texture umgesetzt werden. Diese Textur wechselt in z-Richtung zwischen zwei entsättigten Brauntönen. Die Konfiguration der Checker Texture ist im Screenshot abgebildet.

Principled BSDF Parameter:

  • Roughness: 0.8
  • Transmission: 0.3

Entscheidungslogik

Nachdem nun alle Materialien eingerichtet wurden, müssen diese jetzt durch eine bestimmte Entscheidungslogik miteinander kombiniert werden. Als Grundlage für die Entscheidungslogik dienen die Schwarz-Weiß Texturen der Copper, Soldermask und Silkscreen Layer (Ebenenmasken). Dabei werden folgende Annahmen getroffen.

  • Bei der Copper Maske repräsentiert Schwarz, dass Kupfer vorhanden ist. Bei Weiß ist kein Kupfer vorhanden.
  • Bei der Silkscreen Maske repräsentiert Schwarz, dass Bestückungsdruck vorhanden ist. Bei Weiß ist kein Bestückungsdruck vorhanden.
  • Bei der Soldermask Maske repräsentiert Schwarz, dass kein Bestückungsdruck vorhanden ist. Bei Weiß ist Bestückungsdruck vorhanden.

Materialien kombinieren

Die einzelnen Ebenen (Copper, Soldermask, Silkscreen) werden in einer bestimmten Reihenfolge auf das Grundmaterial der Platine aufgetragen. Daraus resultiert eine Hierarchie, die bei der Kombination der Materialien berücksichtigt werden muss.

  1. Die untersten Schichten sind das Grundmaterial und die Kupferschicht. Die Copper Maske dient dabei zur Entscheidung, wo Kupfer sichtbar sein soll. Wenn kein Kupfer vorhanden ist, kommt das Grundmaterial zum Einsatz.

  2. Darüber befindet sich der Lötstopplack. Überall wo Lötstopplack ist, soll das Kupfer Material und das Grundmaterial nicht sichtbar sein. Dabei gibt es die Ausnahme, dass der Lötstopplack nur auf der Ober- oder Unterseite vorhanden sein darf. Das heißt in Löchern oder in der Zwischenschicht ist entweder Kupfer oder das Grundmaterial sichtbar. (Dies wird durch 2* berücksichtigt)

  3. Oberhalb des Lötstopplacks befindet sich nur noch der Bestückungsdruck. Dieser "überschreibt" alle anderen Materialien. Zur Bestimmung, wo der Bestückungsdruck sichtbar sein soll, dient die Silkscreen Maske.

Beim Kombinieren des Lötstopplacks und des Grundmaterials kommt ein weiterer Entscheider zum Einsatz (im Screenshot "Middle Decider" genannt). Dieser liefert den Wert 1, wenn es sich um die Ober- oder Unterseite handelt, und dazwischen den Wert 0. Mithilfe einer ColorRamp und den z-Koordinaten der Texture Coordinate Node wird eine Maske erzeugt, wobei Schwarz für 0.0 und Weiß für 1.0 steht.

Displacement berechnen

Mithilfe des Displacement (engl. Verschiebung) lässt sich die Oberfläche eines Körpers verformen. Somit ist es möglich die Höhenunterschiede zwischen den einzelnen Ebenen darzustellen. Dabei kann man die Ebenenmasken mit einem Koeffizient wichten und zusammenaddieren. Dies kann über eine Skalarprodukt zweier Vektoren im Shader Editor umgesetzt werden (siehe Screenshot). Der dabei entstehende Wert entspricht dem Höhenunterschied zur ursprünglichen Oberfläche.

Der zweite Vektor enthält die Wichtungen 30, 30 und 14. Am Ende wird das Skalarprodukt noch durch eine Multiply Node auf ein tausendstel herunterskaliert, damit die Verformung nicht zu groß ist. Zusammenfassend wird das Displacement demnach über diese Formel berechnet:

Displacement = 0.001 * (30 * CopperMask + 30 * SoldermaskMask + 14 * SilkscreenMask)

Bei der Berechnung des Displacement muss darauf geachtet werden, dass die Kupfer Maske und Bestückungsdruck Maske invertiert werden müssen, damit richtig addiert wird.

Finales Setup

Nachdem alles richtig verbunden wurde, sollte der Shader für die Platine so aussehen:

Fazit

Das 3D Modell der Platine wurde nun mit einen komplexen Shader ausgestattet. Dieser ist in der Lage verschiedene Materialien miteinander zu kombinieren, sodass sie an den Stellen angezeigt werden, wie es von der Soldermask, Copper oder Silkscreen Textur vorgeschrieben wird. Außerdem wurde die Platine mit einem Displacement ausgestattet, welches die Höhenunterschiede der einzelnen Ebenen abbildet.

Nächster Teil: PCBs rendern (Teil 3) - Finale Schritte