Sketch-Shading von 3D-Objekten Sebastian Greif Erhan Gürbüz Fachbereich Informatik Hochschule Darmstadt ABSTRACT In diesem Paper wird ein Non-Photorealistic Rendering Verfahren zum skizzenhaften Darstellen von 3D-Objekten beschrieben. Das Hauptaugenmerk liegt hierbei auf der Extraktion der relevanten Objektkanten. Hierzu arbeitet das vorgestellte Verfahren im 2D-Bildraum auf der Tiefen- und Normal-Map des Objektes. Verfahren angewandt, um die grafischen Informationen möglichst anschaulich zu präsentieren, ohne dabei auf Photorealismus abzuzielen. Das vermehrte Aufkommen von Shader-Technologien auf Grafikkarten und den dazugehörigen Hochsprachen wie HLSL oder GLSL hat ebenfalls dazu beigetragen, dass solche Non-Photorealistic Rendering Effekte oftmals mit verhältnismäßig einfachen Mitteln zu realisieren sind. 1. Einleitung Der Gegenstand der heutigen Forschungen in der Computergrafik ist häufig eine möglichst realitätsnahe Darstellung computergenerierter Objekte. Durch die ständige Weiterentwicklung, sowohl der Grafikhardware als auch der Renderingverfahren, ist die Visualisierung immer realistischerer Szenen in Echtzeit möglich. Jedoch ist Photorealismus nicht immer die beste Methode um grafische Informationen darzustellen. In der Geschichte der Kunst kann man beobachten, dass neben realistischen Darstellungen auch viele andere Stile ihre große Bedeutung hatten und weiterhin haben. Auch im Bereich der Computergrafik spielt das Non-Photorealistic Rendering, oder kurz NPR, eine sehr wichtige Rolle. Beim NPR liegt der Schwerpunkt nicht auf der realistischen Darstellung, sondern vielmehr auf der Nachahrmung bestimmter künstlerischer Stilmittel. So kommen in heutigen Computerspielen oder Filmen oftmals “künstlerische” Effekte, wie zum Bespiel das Cartoon-Rendering, zum Einsatz. Auch bei der Darstellung von technischen Illustrationen werden oft Im Folgenden soll nun Sketch-Shading als ein Vetreter der NPR-Verfahren vorgestellt werden. Eine mögliche Anwendung dieses Verfahrens, ist beispielsweise die künstlerische Darstellung von Exponaten in einem Museum. Dieses Szenario wurde gewählt, um die Ergebnisse des Sketch-Shaders in einer Anwendung zu demonstrieren. Sowohl die Ergebnisbilder des SketchShaders, als auch die Screenshots der Anwendung, sind in Kapitel 3 zu finden. Die dargestellten Modelle sind frei zugänglich unter [7] und [8]. 2. Sketch-Shading Sketch-Shading ist ein Verfahren, zur skizzenhaften Darstellung einer Szene. Die Objekte der Szene sollen den Eindruck vermitteln, als wären sie per Hand skizzenhaft mit einem Bleistift gezeichnet wurden. Hierbei findet meist keine Schattierung der Objekte statt, sondern die Darstellung erfolgt ausschließlich über die für die Form des Objektes relevanten Kanten. Eine typische Bleistiftskizze ist in Abbildung 1 dargestellt. 2.1 Extraktion der Kanten Eine einfache Möglichkeit zum Erkennen von Kanten ist die Kantendetektion im 2D-Bildraum. Der Vorteil dieses Verfahrens gegenüber einer Detektion der Kanten im 3DObjektraum ist es, dass es unabhängig von der Geometrie und Topologie des zugrunde liegenden Polygonnetzes arbeitet. Weiterhin lässt diese Art der Kantendetektion einen Einsatz von konventionellen Bildbearbeitungsverfahren zu. Einige Verfahren zur Extraktion von Silhouetten im 3D-Objektraum sind in [3] beschrieben und werden hier nicht näher erläutert. Abbildung 1: Typische Bleistiftskizze Bei den relevanten Kanten handelt es sich nicht nur um die Kontur, also die Silhouette des Objektes. Vielmehr müssen auch die inneren Kanten erkannt und dargestellt werden, um bei dem sonst nicht schattiertem Objekt einen räumlichen Eindruck der Form und Gestalt zu bekommen. Bei den inneren Kanten handelt es sich um Knickkanten und Unstetigkeiten in der Oberfläche. Für die Extraktion der Kanten im Bildraum wird die Szene zunächst aus der gewünschten Perspektive gerendert. Anschließend wird das daraus entstandene Bild in einer eigenen Textur gespeichert. Auf diesem zweidimensionalem Bild lässt sich nun ein Kantendetektor anwenden, um dann die gefundenen Kanten darzustellen oder weiter zu verarbeiten. Das Problem bei einem auf diese Art gerendertem Bild ist jedoch, dass die darin gefundenen Kanten nicht unbedingt den Kanten entsprechen, welche für die Form des Objektes ausschlaggebend sind. Zum Beispiel kann es bei einem Objekt mit einer hochfrequenten Textur oder durch unterschiedliche Schattierungen zu unerwünschten Kanten kommen. Andererseits lassen sich keine Kanten zwischen überlappenden Objekten oder Objektteilen mit der selben Farbe oder Schattierung erkennen. Abbildung 3 aus [6] zeigt auf der linken Seite das Originalbild einer schattierten und texturierten Szene. Auf der rechten Seite ist das zugehörige Kantenbild zu sehen. Abbildung 2: Die relevanten Kanten eines Objektes. Silhouette (rot), Beispiel einer Knickkante (gelb) und Beispiel einer Abbruchkante (grün). In Abbildung 2 werden die für das Sketch-Shading wichtigen Kanten visualisiert. Rot dargestellt, ist die Silhouette des Objektes. Bei der gelben Kante handelt es sich um eine Knickkante. In dieser Kante treffen zwei Flächen mit unterschiedlich orientierten Normalvektoren aufeinander. Die grüne Kante stellt eine Abbruchkante dar. Hierbei handelt es sich um eine Kante, die beispielsweise bei einer Unstetigkeit in der Oberfläche auftritt. Abbildung 3: Kantendetektion einer schattierten Szene aus [6]. Im Folgenden werden wir auf ein Verfahren eingehen, welches teilweise bereits in [4] vorgestellt und ebenfalls in [5] und [1] näher beschrieben wird. Dieses Verfahren ist in der Lage, nicht nur die Silhouette des Objektes, sondern auch die Knickkanten und Unstetigkeiten in der Oberfläche zu detektieren. Hierbei dienen sowohl die Normalen als auch die Tiefenwerte der darzustellenden Polygone als Grundlage der Kantendetektion. Dieses Verfahren ist auf Basis von Shadern leicht zu implementieren und liefert sehr gute Ergebnisse in Echtzeit. 2.1.1. Tiefen-Map Um die oben erwähnten Probleme bei der Kantenfindung zu umgehen, kann eine Tiefen-Map eingesetzt werden, um bestimmte Kanten zu erkennen. Zur Generierung der Tiefen-Map werden nicht die Farben der Pixel, sondern die Tiefenwerte, also der Abstand zur Bildebene, der entsprechenden Punkte im dreidimensionalen Raum in eine Textur gerendert. Daraufhin wird dann ein Kantendetektor, wie beispielsweise der Sobel-Operator (siehe Anhang A), auf das so entstandene Bild angewendet. Dieses Verfahren liefert zum einen die Silhouette des Objekts, da zwischen Objekt und Hintergrund normalerweise immer ein Sprung in der Tiefe vorliegt. Zum anderen werden zusätzlich innere Kanten bei Unstetigkeiten in der Tiefe zwischen sich überlappenden Objekten oder Objektteilen erkannt. In Abbildung 4 ist das Verfahren der Tiefen-Map am Beispiel von zwei verschiedenen Objekten dargestellt. Auf den Abbildungen 4 a) und c) sind jeweils die TiefenMaps der gerenderten Objekte dargestellt. Die Abbildungen 4 b) und d) zeigen die vom Kantendetektor ermittelten Kanten. Wie in den Ergebnisbildern zu erkennen ist, kann die Silhouette immer vollständig extrahiert werden. Weiterhin ist zu sehen, dass die Kanten bei den sich überlappenden Segeln in Abbildung 4 b) ebenfalls gut detektiert werden, da hier offensichtlich eine Unstetigkeit in der Tiefe vorliegt. Auch bei diesem Verfahren, können nicht alle relevanten Kanten eines Objektes ermittelt werden. So werden weder Knickkanten, also Kanten zwischen Flächen deren Normalvektoren stark voneinander abweichen, noch Außenkanten zwischen Objekten, die annähernd in der selben Tiefe liegen gefunden. Abbildung 4 d) zeigt, dass die Knickkanten der Würfel auf Grundlage des TiefenBildes nicht erkannt werden können. 2.1.2. Normal-Map Um ebenfalls die Kanten bei einer Änderung der Oberflächenorientierung zu detektieren, müssen die Normalvektoren, also die Ausrichtung der Flächen, berücksichtigt werden. Abbildung 4: Kantendetektion auf Grundlage einer Tiefen-Map. a) und c) zeigen die Tiefen-Map und b) und d) das Ergebnis der Kantendetektion Hierzu ist es möglich eine Normal-Map als Grundlage des Kantendetektors zu verwenden. Diese Map enthält für jeden Pixel der Oberfläche eines Objektes den zugehörigen Normalvektor. Normal-Maps lassen sich sehr leicht unter Verwendung von Shadern erstellen. Dabei werden zunächst im Vertexshader die von der Anwendung übergebenen Normalvektoren jedes Vertices über die einzelnen Pixel interpoliert. Anschließend müssen die Komponenten der Normalvektoren im Pixelshader dann noch auf das Intervall [0, 1] transformiert werden, um diese in eine Textur speichern zu können. Danach werden einfach die X-, Y- und ZKoordinaten der Normalvektoren in die RGB-Kanäle der Textur abgelegt. Durch Anwendung des Kantendetektors auf die unterschiedlichen Kanäle der Normal-Map ist es nun leicht möglich, Sprünge in der Ausrichtung der Normalvektoren und damit die Knickkanten zwischen unterschiedlich orientierten Flächen zu erkennen. In Abbildung 5 a) und c) sind die Normal-Maps zweier Objekte dargestellt. Die Farbe eines Pixels ergibt sich hier also aus den Koordinaten des zugehörigen Normalvektors. Der Farbraum ist hier leicht verschoben, da die Koordinaten der Normalvektoren ja bereits auf das Intervall [0, 1] abgebildet wurden. Das Ergebnisbild des Kantendetektors b) zeigt, dass sowohl die einzelnen Falten des Rockes, als auch die Details im Kopfbereich der Statue mit Hilfe dieses Verfahrens sehr gut extrahiert werden können. Gerade diese feinen Details spielen eine große Rolle um die geometrischen Beschaffenheiten eines Objektes gut erkennen zu können und sind somit sehr wichtig für die Realisierung des Sketch-Shaders. Im Gegensatz zu dem Verfahren der Tiefen-Map in Abbildung 4 d), ist es mit der Normal-Map nun einfach möglich alle Knickkanten des Würfels, wie in Abbildung 5 d) zu sehen, zu identifizieren. Jedoch zeigt die Abbildung 5 d) auch eine Schwäche dieses Verfahrens. Wie man am obersten Würfel sehen kann, wird die vordere Abbruchkante nicht durchgängig erkannt. Das liegt offensichtlich daran, dass die beiden sich überlappenden Flächen die gleiche Ausrichtung haben, also den gleichen Normalvektor aufweisen. Beispielsweise würden mit diesem Verfahren auch die Kanten zwischen den sich überlappenden Segeln in Abbildung 4 b) nicht vollständig erkannt werden. 2.1.3. Kombination der Tiefen- und Normal-Map Um die, in den vorherigen beiden Kapiteln beschriebenen, Nachteile sowohl der Tiefen- als auch der Normal-Map zum vermeiden, können die beiden Verfahren miteinander kombiniert werden. Die Kombination dieser Verfahren ermöglicht eine Detektion aller, für das Sketch-Shading relevanten, Kanten. Abbildung 5: Kantendetektion auf Grundlage der Normal-Map. a) und c) visualisieren die Normal-Map und b) und d) das Ergebnis des Kantendetektors. Wie bereits erwähnt wurde, liefert die Tiefen-Map die Kanten, die bei Unstetigkeiten in der Tiefe entstehen und durch die Normal-Map findet man die Knickkanten zwischen unterschiedlich orientierten Flächenelementen. Die Silhouette der Objekte, also die Abgrenzung gegen den Hintergrund, kann sowohl aus der Tiefen-, als auch aus der Normal-Map gewonnen werden. Es gibt natürlich immer noch Kanten, die auch durch den Einsatz beider Verfahren nicht erkannt werden können. Dieser Fall tritt ein, wenn beispielsweise zwei sich überlappende Objektteile annähernd in der selben Tiefe liegen und zusätzlich die gleiche Ausrichtung aufweisen. Diese Kanten sind jedoch meist nicht ausschlaggebend für die korrekte geometrische Interpretation des Objektes und können somit beim Sketch-Shading vernachlässigt werden. Für die Kombination der beiden Verfahren sind ebenfalls nur zwei Render-Passes nötig. Hierfür werden im ersten Render-Pass sowohl die Normalvektoren, als auch die Tiefenwerte in eine einzige Textur geschrieben. Für den Tiefenwert kann hierfür der Alpha-Kanal genutzt werden. Dabei ist jedoch zu beachten, dass man dadurch nur eine Genauigkeit von 8 Bit für die Tiefenwerten zur Verfügung hat. Bei größeren Szenen mit mehreren Objekten in verschiedenen Tiefen ist es ratsam, eine höhere Auflösung für die Tiefenwerte zu verwenden. Für das Sketch-Rendering, wird dann im zweiten RenderPass der Kantendetektor auf alle Kanäle der Textur und damit sowohl auf die Normalvektoren als auch auf die Tiefenwerte einzeln angewendet. Die Ergebniswerte der einzelnen Kanäle gehen dann alle in das endgültige Resultat der Kantendetektion für das aktuelle Pixel ein. Hierbei wird der Tiefenwert stärker gewichtet, da die Unterschiede im Tiefen-Kanal meist betragsmäßig sehr klein sind. Um den Eindruck einer Strichzeichnung zu erwecken, ist es notwendig verschiedene Intensitäten bei den Kanten darzustellen. Das heißt, dass bezüglich des Ergebniswertes der Kantendetektion nicht mit Hilfe eines Schwellwertes eine binäre Entscheidung getroffen wird, ob eine Kante gefunden wurde oder nicht. Vielmehr dient der Ergebniswert des Kantendetektors direkt als Grundlage für die Intensität der entsprechenden Kante. Somit können verschieden stark ausgeprägte Kanten durch unterschiedliche Grauabstufungen repräsentiert werden. Durch dieses Vorgehen wird auch erreicht, dass beispielsweise stark gekrümmte Flächen eine leichte Schattierung erhalten. Diese gekrümmten Flächen beinhalten zwar keine Knickkanten, jedoch ist der Unterschied in den interpolierten Normalvektoren zweier benachbarter Pixel so groß, dass daraus eine leichte Schattierung resultiert. Dies vermittelt den Eindruck, als wären diese Flächen beispielsweise mit einer KohleZeichentechnik hervorgehoben wurden. Auf Abbildung 6 a) ist die Normal-Map mit den über die Flächen interpolierten Normalvektoren dargestellt. In der Abbildung 6 b) ist gut zu erkennen, dass die stärker gekrümmten Flächen am Griff oder Ausguss der Teekanne leicht grau schattiert sind. Abbildung 6: Schattierung von stark gekrümmten Flächen. a) zeigt die Normal-Map und b) die Schattierung der stark gekrümmten Flächen 2.2 Verwischen der Kanten Bei dem Erstellen von Skizzen mit dem Bleistift, entstehen fast nie scharfe, klar abgegrenzte Linien. Dies liegt daran, dass die Mine des Bleistiftes abgerundet ist und dadurch kein einheitlicher Druck auf das Papier ausgeübt wird. So entstehen Kanten, deren Intensität nach außen hin abnimmt. Eine ebenfalls häufig genutzte Technik bei Skizzen ist das, in Kapitel 2.1.3 bereits beschriebene, Hervorheben von bestimmten Details durch Schattierung. Hierzu wird beispielsweise mit dem Bleistift Graphit auf die Fläche aufgetragen und dann mit dem Finger leicht verwischt. Dieses Verfahren beruht auf der Kantendetektion im 2DBildraum anhand einer Tiefen- und Normal-Map. Abbildung 8 zeigt einige Resultate des Sketch-Shaders. Gerade bei hoch triangulierten 3D-Modellen mit vielen Details liefert dieses Verfahren sehr schöne Ergebnisse. Eine mögliche Erweiterung des Verfahrens wäre beispielsweise eine Methode zur Erstellung von Linien mit unterschiedlicher Stärken oder Linien die nicht durchgezogen sind, um ein Absetzen des Bleistiftes zu simulieren. Ein Verfahren hierfür, welches auf Stochastik und physikalischen Partikel-Systemen basiert ist in [2] beschrieben. Abbildung 7: Blur des Bildes als Post-Effekt. a) Originalbild der Kantenextraktion. b) Bild nach Anwendung des Blur-Filters. Um ein ähnliches Ergebnis bei dem Sketch-Shading zu erreichen, wird als letzter Schritt ein Blur-Effekt auf das Ergebnisbild der Kantenextraktion angewendet. Hierzu werden im Pixel-Shader die Farbwerte des aktuellen und der umliegenden Pixel aus dem Ergebnisbild gesampled und mit einem 3x3 Gauss-Filter (siehe Anhang B) geglättet. Abbildung 7 zeigt den Vergleich des Originalbildes der Kantenextraktion mit dem Ergebnis nach Anwendung des Blur-Filters. Wie zu sehen ist, resultieren die in Abbildung 7 a) noch sehr pixeligen schwarzen Linien im linken Bildbereich, in geglätteten und somit weichen Linien. Diese Linien ähneln eher einem von Hand gezeichneten Bleistiftstrich und wirken dadurch wesentlich realistischer. Die Übergänge der grauen Schattierungen im Augen- und Nasenbereich der Figurine sind in Abbildung 7 a) noch sehr stufig. Erst nach Anwendung des Weichzeichners ähneln diese Bereiche mehr einer Bleistiftschattierung. 3. Resultate In diesem Paper wurde ein Non-Photorealistic Rendering Verfahren vorgestellt, welches eine skizzenhafte Darstellung von dreidimensionalen Modellen ermöglicht. Abbildung 8: Ergebnisse des Sketch-Shaders bei drei unterschiedlichen Modellen Zur Demonstration des Sketch-Shaders wurde eine kleine Anwendung entwickelt. Diese Anwendung ermöglicht es, den Sketch-Shader auf ein beliebiges 3D-Model anzuwenden. Die daraus enstandene Skizze, wird dann auf einer Staffelei präsentiert (siehe Abbildung 9 und 10). [4] Takafumi Saito and Tokiichiro Takahashi, “Comprehensible Rendering of 3-D Shapes.” In Proc. of SIGGRAPH ’90, pages 197–206, August 1990. [5] Philippe Decaudin, “Cartoon-looking rendering of 3Dscenes,” Technical Report INRIA 2919, Universite de Technologie de Compiegne, France, June 1996. Abbildung 9: Sketch-Shading der Venus von Milo [6] Thomas Strothotte, Stefan Schlechtweg. NonPhotorealistic Computer Graphics – Modeling, Rendering and Animation. Morgan Kaufman Publishers, San Francisco, 2002. ISBN 1-55860-787-0 [7] http://www.3DGurukul.com, zuletzt besucht am: 25.05.2007 [8] http://www.3DKingdom.org, zuletzt besucht am: 25.05.2007 A Sobel Kantendetektor Bei dem Sobel-Operator handelt es sich um einen einfachen Operator zur Kantendetektion im Bildraum. Abbildung 10: Sketch-Shading einer Beethoven-Büste Gy = S y ∗ I = Literaturverzeichnis [1] Aaron Hertzmann, “Introduction to 3D NonPhotorealistic Rendering: Silhouettes and Outlines”. In: Stuart Green, editor, SIGGRAPH 99 Course Notes, ACM SIGGRAPH, L.A., 1999 [2] Cassidy Curtis, “Loose and Sketchy Animation”. In SIGGRAPH ’98: ACM SIGGRAPH 98 Electronic art and animation catalog, ACM Press, New York, NY, USA, page 145. [ ] [ ] −1 0 1 G x = S x ∗ I = −2 0 2 ∗ I −1 0 1 −1 −2 −1 0 0 0 ∗ I 1 2 1 Die Faltungsmatrix Sx angewandt auf das Bild I liefert die vertikalen Kanten des Bildes und Sy die Horizontalen Kanten. Eine richtungsunabhängige Kanteninformation erhält man aus der Länge des Gradienten. G = G 2 x G 2y B Gauss-Filter [3] Bruce Gooch, Ashley Hartner, Mark Hartner, Elaine Cohen. “Object Space Silhouette Algorithims”. University of Utah. Unpublished 2003 Der Gauss-Filter ist eine Faltungsmatrix zur Bildglättung. Im Folgenden ist die 3x3 Faltungsmatrix des Gauss- Filters dargestellt, welche in diesem Paper Anwendung fand. [ ] 1 2 1 Gauss− Filter = 1/16 ∗ 2 4 2 1 2 1