In diesem kleinen Tutorial möchte ich zeigen wie man mit relativ einfachen Arbeitsschritten aus einer normalen Textur eine qualitativ hochwertige Displacement Map generieren kann.
Es gibt diesbezüglich zwar schon ein Programm namens “CrazyBump” (www.crazybump.com), jedoch bin ich mit dessen Ergebnisen nicht immer ganz zufrieden, und deshalb habe ich selber ein bisschen geforscht, wie man Displacement Maps einfach selber generieren kann.
Beim Erstellen von Displecement Maps aus normalen Texturen gibt es ein Problem. Denn, wie es nicht anders sein könnte, stellen Texturen die Farbe und nicht die Tiefe einer Oberfläche dar. Gruben kann man allerdings trotzdem erkennen, da sie sozusagen im Schatten liegen. Diese erscheinen also dunkler als Erhebungen. Das gibt uns einen Hinweis, wie wir die Texturen auswählen sollten. D.h. gleichmässig beleuchtete Oberflächen, bei denen Gruben nicht wirklich dunkler erscheinen werden ein schlechtes Ergebnis geben.
Wenn man also eine Textur total desaturiert hat man im Grund fast schon eine Displacement Map, allerdings ist das Ergebnis viel zu „flach“ und diese Textur kann höchstens als Bump Map dienen.
Warum ist das so? Ganz einfach, weil tiefere Ebenen (oder Gruben) im selben „schwarz-weiss-Bereich“ sind wie hohe Ebenen. Im Bild erscheinen sie zwar dunkler weil bei Gruben mehr dunklere Bereiche sind wie helle. Das Problem ist allerdings, dass kleine Erhebungen in tiefen Ebenen einen selben (oder ähnlichen) Weisswert/Helligkeit haben wie Erhebungen in hohen Ebenen. D.h. sie haben die selbe Höhe. Damit wir also mehr Tiefe in die Map bringen, muss alles was in einer Grube ist grundsätzlich dunkler sein wie alles was auf einer Erhebung ist. Sobald etwas die selbe Helligkeit hat, ist es auch auf der selben Höhe.
Da wir nun wissen was an dieser S/W-Map noch falsch ist bzw. fehlt stellt sich nun die Frage, wie wir das erreichen. Und die Lösung ist im Grunde ganz einfach. Wir filtern die Map nach Detailstufen. D.h. in der ersten und gröbsten Detailstufe interessieren wir uns nicht für die kleinen Grübchen und Kerben, sondern für die grossen „Täler und Berge“. Indem wir also die Map stark weich zeichnen (also z.b. mit einem Gaussian Blur) werden diese kleinen Details verwischt und nur die grobe Struktur bleibt übrig.
Vorher empfehle ich übrigens die ganze Komposition auf 16bit-Mode zu stellen, weil Displacement Maps grundsätzlich hohe Bit-tiefen benötigen.
Da mit diesem Effekt (Weichzeichnen) aber der Kontrast verringert wird, muss dieser wieder angepasst werden (d.h. 100% schwarz bis 100% weiss).
Am einfachsten macht man das mit „Auto Contrast“. Hier ist allerdings Wichtig, dass man vorher die Toleranzen auf 0,00% Stellt [1] (Levels… → Options… → Shadows-Clip und Highlights-Clip auf 0,00% Stellen).
Und nun bauen wir stufenweise mehr Detail in unsere Map. In meinem Beispiel habe ich 8 Stufen, wobei ich bei den höheren Detailstufen kleinere „Blur-Schritte“ gemacht habe [2] (somit werden die kleinen Details nicht ganz so spitzig). Bei der niedrigsten Detailstufe sollte der Blur so stark sein, dass die gröbsten Details gerade noch sichtbar sind (z.B. bei einer Mauer sollten die einzelnen Steine noch erkennbar sein). Bei jedem neuem Layer wird der Kontrast natürlich angepasst. Die Oberste stufe ist im Grunde das originale Bild, allerdings auch mit Kontrastanpassungen (falls überhaupt nötig).
Diese Layer müssen jetzt ineinander geblendet werden. Hierfür verwende ich als Layereffect „Screen“ [1], dabei muss aber die Opacity angepasst werden. Diese ergibt sich aus der Anzahl von Layer. In meinem Beispiel also 8 Layer. D.h. 100% / 8 Layer ergiebt 12.5 % für jeden Layer [3]. Der unterste wird natürlich nicht mitgezählt. Dieser bleibt auf 100% Opacity und hat „Normal“ als Layereffect.
Nun kann man alle Layer zusammenmergen und hat im Grunde schon die fertige Displacement Map. Diese kann man auch problemlos tweaken. Z.B. kann man die Gradationskurven bearbeiten.
Gerender sieht das dann so aus (3d Studo Max & VRay & VRayDisplacement):
Bzw. mit Diffusemap so:
Und hier noch zwei weitere Beispiele:
Es gibt sicherlich auch andere Möglichkeiten einen solchen Effekt zu erreichen, wichtig ist allerdgins nur das Prinzip das dahinter steckt.
Photoshop hat z.B. einen Filter namens “Surface Blur”, welcher einen sehr ähnlichen Effekt erzeugt, allerdings wird mit diesem Filter die Oberfläche meist sehr unruhig und rau. Bis jetzt sind mir die besten Ergebnisse mit diesem Workflow gelungen, da man relativ viele Kalibrierungsmöglichkeiten hat.
Ich hoffe dieses Tutorial war halbwegs verständlich. Falls aber doch Unklarheiten bestehen sollten, könnt ihr gerne Fragen stellen.
Ansonsten wünsche ich viel Spass beim selber Probieren!
edit:
Auf Wunsch von Joooo hab ich noch ein ganzes Beispiel gemacht. Das könnt ihr hier herunterladen. Im Zip-File enthalten sind:
- Orgiginale Textur / Diffuse Map (hab ich übrigens von www.cgtextures.com)
- psd-File mit den einzelnen Layer
- fertige Displacement-Map (bei der 2. version hab ich einfach nur den Kontrast mittels Curves bearbeitet)
- 3ds-Max-Szene mit dementsprechenden Material (ACHTUNG: VRay-Materials & VRay-Displacement)
Aussehen sollte das ganze dann ungefähr so:














