Mittwoch, 27. Februar 2013

Eine Normal-Map mit GIMP erstellen

GIMP mit Normal-Map Plugin
In Kürze wird in Second Life ein neues Materialsystem eingeführt, das auf die Verwendung von Normal- und Specular-Maps aufbaut. Im Blog von Nalates wurde ich letzte Woche auf ein Video Tutorial aufmerksam, in dem das Erstellen von Normal-Maps mit dem kostenlosen Grafikprogramm GIMP erklärt wird. Ich habe das auch mal ausprobiert und es funktionierte ganz gut. Ich habe mir nun einige Normal-Maps erstellt, die ich dann im SL-Viewer testen kann, sobald einer veröffentlicht wird. Der Servercode für diese Funktion wurde ja bereits letzte Woche im ganzen SL-Grid aufgespielt.

Für alle, die das auch mal probieren wollen, folgt jetzt eine kleine Anleitung für die notwendigen Schritte auf einem Windows Rechner. Auf die optimalen Einstellungen für eine Normal-Map gehe ich allerdings nicht tiefer ein, denn davon habe ich selbst keine Ahnung.^^ Die Links zu den Downloadseiten sind hier einmal direkt im Text zu finden und am Ende nochmal als Liste zusammengefasst. Das englische Video Tutorial gibt es hier auf YouTube:
>> GIMP Tutorial - Learn how to use the Normal Map Plug in for GIMP 2.8

Schritt 1
Wer GIMP noch nicht auf dem Rechner hat, sollte es erstmal runterladen und installieren. Die aktuelle Version ist die 2.8.4. Ich selbst bevorzuge die Portable Version, bei der nur das ZIP-Archiv entpackt wird. Wer lieber ein Installationsprogramm benutzen möchte, holt sich die ausführbare Version.

Die ausführbare Version gibt es auf der GIMP-Homepage:
>> Download GIMP 2.8.4

Die Portable Version gibt es auf Chip Online:
>> Download GIMP Portable 2.8.4

Schritt 2
Ist GIMP installiert, braucht man das Plugin zum Erstellen der Normal-Map. Auch das Plugin ist kostenlos und kann auf Google Code runtergeladen werden. Da ich ein 64-Bit Windows benutze, habe ich zuerst auch das 64-Bit Plugin verwendet. Das funktionierte bei mir aber nicht (vielleicht, weil ich GIMP Portable benutze?). Die 32-Bit Version klappte dann prima. Deshalb empfehle ich generell das 32-Bit Plugin. Wer will, kann natürlich trotzdem auch mal 64-Bit probieren.

Downloadseite für das GIMP Normal-Map Plugin:
>> Download GIMP normalmap plugin

Die Datei "gimp-normalmap-win32-1.2.3.zip" ist die 32-Bit Version (links unten im Feld "Featured").

Schritt 3
Das ZIP-Archiv des Plugins nun in einen leeren Ordner entpacken. Das sollte etwa so aussehen:


Die Datei "normalmap.exe" (blauer Punkt) muss nun in den Plugin-Ordner von GIMP kopiert werden.
Für die installierte Version lautet der Pfad in etwa so:
"C:\Programme\GIMP 2\lib\gimp\2.0\plug-ins\"

Für die portable Version so:
"C:\Programme\GIMPPortable\App\gimp\lib\gimp\2.0\plug-ins\"

Die drei Dateien mit .dll am Ende (grüner Punkt) kommen in diesen Ordner:
Bei der installierten Version:
"C:\Programme\GIMP 2\bin\"

Bei der portablen Version:
"C:\Programme\GIMPPortable\App\gimp\bin\"

Schritt 4
Nun kann man GIMP mal starten, um das Ganze zu testen. Ist das Programm neu installiert worden, dauert es beim ersten Start ziemlich lange, bis alle Bibliotheken und Plugins eingelesen sind. Beim nächsten Start geht es dann wesentlich schneller. Mich persönlich nervt auch der Mehrfenster-Modus von GIMP, bei dem man ständig am Rumschieben ist. Deshalb stelle ich immer den Einzelfenster-Modus an. Das geht mit Menüpunkt > Fenster > Einzelfenster-Modus (es sollte ein Haken neben dem Menüeintrag zu sehen sein).

Ich habe diese Textur verwendet
Schritt 5
Was man zum Erstellen der Normal-Map noch braucht, ist eine Textur mit einer Struktur, die in 3D einen gewissen Höhenunterschied auf der Oberfläche haben sollte. Ich habe mich etwas am Video orientiert und eine sehr grobe Steinwand verwendet. Hier ein paar Links zu brauchbaren Texturen:

Meine verwendete Textur gibt es hier:
>> Stone wall 4 - (Lizenz CC-BY-SA, also frei für Hobbynutzung)

Hier gibts die Textur aus dem Video Tutorial:
>> Texturemate

Nach weiteren Texturen kann man auch hier suchen:
>> Noctua Graphics: Textures
>> Mayang's Textures

Schritt 6
Für den Einsatz in SL sind die Texturen von der Webseite eigentlich zu groß. Ich habe die ursprüngliche Größe von 1024 x 1024 Pixel auf 512 x 512 Pixel reduziert. Das kann man nach dem Öffnen direkt in GIMP machen unter > Bild > Bild skalieren. Dann die Textur unter neuem Namen abspeichern, denn für den späteren 3D-Effekt sind immer beide Texturen notwendig. Also die original Datei und die daraus generierte Nomal-Map Textur.

Damit man alle Funktionen des Normal-Map Plugins nutzen kann, sollte man dem Bild noch einen Alphakanal hinzufügen, wenn noch keiner vorhanden ist. Bei den meisten Texturen aus dem Web ist das nicht der Fall. Den Kanal hinzufügen kann man einfach mit > Ebene > Transparenz > Alphakanal hinzufügen. Der Eintrag ist ausgegraut, wenn das Bild bereits einen Alphakanal hat.

Ungefähre Form der Kurve
Wenn man Lust hat, kann man die Textur noch in eine neue Ebene kopieren und in ein Graustufenbild umwandeln. Das erhöht den Kontrast beim Experimentieren im Normal-Map Editor.

Wie das geht, wird im Video bei Minute 7:19 gezeigt. In Kurzform: Bildebene kopieren mit > Rechtsklick auf Textur-Tumbnail (recht oben), im Kontextmenü danach auf > Ebene duplizieren. Dann in Graustufen umwandeln über > Farben > Entsättigen > OK. Danach den Kontrast erhöhen über > Farben > Kurven. Dort die Kurve etwa in die Form bringen, die hier in meinem Beispielbild rechts zu sehen ist.

Schritt 7
Nun startet man den Editor für die Normal-Map. Wenn beim Schritt 3 alles richtig gemacht wurde, geht das über > Filter > Abbilden > Normalmap.

Hier wird das Plugin für die Normal-Map gestartet

Es öffnet sich ein neues Fenster mit dem Vorschaubild der Normal-Map, sowie verschiedenen Einstellmöglichkeiten. Wenn man sehen möchte, wie sich die Einstellungen auswirken, kann man ein weiteres Fenster über den Button "3D Preview" öffnen. Im Web berichten einige Leute zwar darüber, dass bei ihnen GIMP abstürzt, wenn dieses Fenster geöffnet wird. Bei mir läuft das jedoch einwandfrei.

Das Normal-Map Plugin

Die Einstellungen im Editor-Fenster sind sehr vielfältig und wie sich Änderungen dann später in SL auswirken, wird man wohl nur mit etwas Ausprobieren herausfinden. Man erzielt aber auf jeden Fall auch schon gute Ergebnisse, wenn man relativ wenig von den Voreinstellungen abweicht. Ich habe für das Beispiel hier in der Anleitung den Filter auf "3x3" und die Scale auf "6.0" gesetzt (siehe rote Umrandungen im Bild oben). Im 3D Preview kann man dann schon eine deutliche Struktur sehen.

Das 3D Preview Fenster
Für einen stärkeren 3D Effekt habe ich im Preview-Fenster den Objekt Type auf "Cube" umgestellt. Das geht über das Pulldown-Menü oben in der Mitte. Drehen kann man das Objekt mit gedrückter linker Maustaste, zoomen geht mit gedrückter rechter Maustaste. Dazu dann jeweils die Maus entsprechend bewegen.

Wer etwas Glanz auf seiner Struktur haben will, schaltet im Preview-Fenster die "Specular lighting"-Checkbox an und ändert mit dem "Specular exponent"-Schieber den Glanzeffekt auf der Objektoberfläche. Nach links ziehen bedeutet mehr Glanz, nach rechts weniger.

Die Lichtquelle für die Normal-Map kann im 3D Preview auch verschoben werden. Dazu links oben im Fenster einfach auf den Button mit der Glühbirne klicken (zweiter von links). Dann mit gedrückter linker Maustaste das Licht verschieben. Will man die Ansicht wieder drehen, dann zurückschalten mit Klick auf den Kugel-Button oben ganz links.

Wie ich eingangs schon erwähnt habe, gibt es in diesen beiden Plugin Fenstern eine große Anzahl von Möglichkeiten eine Normal-Map zu erstellen. Wer das Video komplett angesehen hat, wird eine Vorstellung davon haben. Ich habe einfach verschiedene Normal-Maps erstellt und sie alle abgespeichert. Sobald diese Texturen in SL unterstützt werden, lade ich sie hoch und schau mir den Effekt an. Wenn man nicht so lange warten will, kann man auch in einem 3D-Programm (z.B. Blender) ein Objekt mit der ursprünglichen Textur plus zugehöriger Normal-Map versehen. Gerendert sieht das dann etwa so aus, wie in SL. Wie das geht, erkläre ich hier aber nicht mehr, denn das wäre ein schon wieder eine neue Anleitung.^^

Vielleicht noch einen Tipp, der auch aus dem Video stammt: Wenn man im 3D Preview die Oberfläche der Textur so sehen will, wie sie später in 3D Umgebungen aussieht, kann man in die beiden Map-Felder die farbige Ausgangstextur laden. Die steht aber nur zur Verfügung, wenn man das Plugin aus einer kopierten Ebene heraus gestartet hat. Das Original ist dann die untere der beiden Texturen in der Auswahl (siehe rote Pfeile im Bild unten).

Lädt man in diese beiden Felder die Ausgangstextur, sieht man die Oberfläche im Preview farbig

Schritt 8
Fast hätte ich es noch vergessen. Das Abspeichern der Normal Map im JPG oder PNG Format geht nicht etwa über "Datei speichern", sondern über > Datei > Exportieren. Dann am besten den Ordner auswählen, in dem auch die ursprüngliche Textur liegt und an die Benennung einfach ein "..._normal" oder etwas anderes anhängen. Die original Textur und die Normal-Map aus meiner Anleitung sehen so aus:

Original Textur
Normal-Map

Hier noch einmal alle Links:

GIMP runterladen:

Normal-Map Plugin runterladen:

Textur-Webseiten:

Tutorial auf YouTube:

Beiträge auf Echt Virtuell:

6 Kommentare:

  1. Danke schön, ich freue mich schon total auf die Funktion. Auch wenn sie wahrscheinlich zuerst dafür verwendet wird, Noppen auf Dildos abzubilden. Immerhin ist es SL und so ;-)

    AntwortenLöschen
    Antworten
    1. Wo treibst du dich denn wieder rum in SL? :)

      Ich denke, dass das vor allem für Häuser und andere Oberflächen von statischen Objekten eingesetzt wird. Allerdings sind Normal-Maps eh nur sichtbar, wenn man Deferred Rendering im Viewer aktiviert hat. Deshalb wird die Optik wohl von vielen SL-Nutzern gar nicht wahrgenommen werden. In deinem Beispiel wird das also ein Zweiklassendildo. Bei schwachen PCs gibt nur ein "...ah", bei High-End Rechnern ein "...aaaaaaaaaahhh..." ;-)

      Löschen
  2. Eine großartige Sache!
    Wird das auch bei halbtransparenten Texturen gehen? Und ich muss mal nach einem Tutorial für diese Sache für Photoshop suchen.

    AntwortenLöschen
    Antworten
    1. Ja, das sollte nach den technischen Beschreibungen in der LL-Wiki funktionieren.
      >> Material Data > Texture Channel Encoding

      Die Erklärung ist allerdings etwas zweideutig. Sieht für mich so aus, als gäbe es einen Schwellwert bei halbtransparenten Alphawerten. Liegt man drunter, wird das Pixel undurchsichtig, liegt man drüber, wird es transparent. Das sind aber Spezifikationen für die Phase 1 des Materialsystems. LL hat damit später noch einiges vor, bis hin zu Vollreflektionen. Vielleicht werden dann auch Halbtransparenzen noch umgesetzt.

      Löschen
  3. Da freue ich mich auch schon lange drauf. Hoffe es klappt :D
    Danke für die Einführung

    AntwortenLöschen
  4. Vor etwa zwei Jahren hab ich das mal angegeben, als jemand fragte, was man sich denn für SL wünsche... ich wurde aber etwas angefahren. Gegen moderne Shader in den 3D Engines ist das Technologie von vorgestern. Ich bin dennoch froh, dass sie jetzt da ist :-)

    http://www.flickr.com/photos/essarah/9168911612/

    Noch zwei Tipps, vor allem, wenn es um Steine geht. Die Vertiefungen zwischen den Steinen kommen mit dem Tool nicht immer gut heraus. Die kann man auf einem transparenten Layer mit einem weichen Pinsel nachzeichnen und dann den Layer je nach gewünschter Tiefe der Ränder mehr oder weniger durchsichtig machen (Deckkraft). Da die meisten Steine auch einen leichten Glanz haben, kann man anschliessend diese Linien auf einen weissen hintergrund kopieren, das ganze Invertieren und aufhellen (je Heller, desto weniger Glanz) und hat so gleich eine passende Map für den Glanz.

    AntwortenLöschen