Hidden-Line-Removal mit Polygon Offset - cg
Transcription
Hidden-Line-Removal mit Polygon Offset - cg
Solid Wireframes Dr.-Ing. Simon Adler Wireframes Einführung Visualisierung der Geometrietopologie Beurteilung der Geometriegüte Qualität von Primitiven Homogenität Geometrieschäden Relevant für Simulationen: FEM, CFD Visualisierung: Bleeding Edges Primitive Rendern als Linienzüge Verdeckung der Linien im Viewport erfordert Hidden-Line-Removal Probleme beim Tiefeneindruck Liniendicke tiefenunabhängig Zulaufen der Darstellung in der Tiefe Multi-Pass Wireframes Hidden-Line-Removal Einfaches Hidden-Line-Removal 2-Pass Rendering Pass 1: Oberfläche (Color-, Depth-Buffer) Pass 2: Gitternetz (Depth-Test) Gut: Oberfläche verdeckt rückseitige Linien Aber: kein Antialiasing doppeltes Rendern der Geometrie Konstante Liniendicke in der Entfernung Z-Fighting aufgrund ähnlicher Tiefenwerte Multi Pass Multi-Pass Wireframes Hidden-Line-Removal mit Polygon Offset Hidden-Line-Removal mit Polygon Offset Variante 2: Polygon Offset Offset in Tiefenwerten distanzabhängiger + konstanter Tiefenwert void glPolygonOffset(GLfloat factor, GLfloat units) Offset Faktoren units: konstanter Offset (=1) factor: tiefenabhängig (=1) Fragmente mit unterschiedlichen Tiefenwerten (Lineare- vs. Trilineare Interpolation) Erforderlicher Offset abhängig vom Primitiv Multi Pass Solid Wireframes bisher: Wireframe zusätzlich rendern als Liniengeometrie Solid Wireframes Wireframe mit dem Surface (Solid) rendern Manipulieren von Fragmenten an Primitivkanten Verallgemeinert: NPR zur Hervorhebung markanter Linien Hajagos 2012: Fast silhouette and crease edge synthesis with geometry shaders Silhouette Rendering Iso-Linien Darstellung Vorteile keine Tiefenprobleme Antialiasing möglich tiefenabhängige Liniendicke Gestalltungsmöglichkeit der Linien Celes 2010, Texture-based wireframe rendering Solid Wireframes Relevante Shader in der Render Pipeline Vertex Shader Zugriff auf Eigenschaften einzelner Vertices Model- und Perspektiven Transformation Output: Clip-Koordinaten Geometry Shader Zugriff auf Eigenschaften der Primitive (Dreiecke, Linien, …) Änderungen der Vertex-Attribute Generieren zusätzlicher Primitive Fragment Shader Zugriff auf Farbinformationen von Pixelkandidaten z.B. Bumpmapping, Textureffekte Vertex Specification Vertex Shader Geometry Shader Post-Processing Primitive Assembly Rasterization Fragment Shader Solid Wireframes Grundprinzip Herkömmliches Rendern des Dreieckes Erforderlich: kürzester Abstand des Fragments zu den Primitivkanten Jedes Kante hälfte der Wireframe-Linie Unterschiedliche Zielstellungen Performance Einfluss auf die Darstellung des Wireframes (Grundlage für NPR-Verfahren) Primitivart: Dreieck, Quad, N-GON Art der Liniendicke (Pixel / Units) Technologische Randbedingungen Nur Verwendung bestimmter Shader Bsp.: WebGL – keine Unterstützung von Geometry Shaders Solid Wireframes – Prozedural Höhen-Ansatz Ziele Performante antialiased Wireframes Liniendicke: Pixel Fokus: Dreiecke (Quads) Geometry Shader Projektion der Vertices in Viewport Space Berechnen: Abstand Vertex mit gegenüberliegender Kante (ℎ𝑖 ) Kantenabstände als zusätzliche Vertex-Attribute Fragment Shader Mittels trilinearer Interpolation Abstände zu allen Kanten Distanzabhängige Kantenglättung 𝑓 𝑥, 𝑑 = 𝑥 2 −8 𝑑 2 White Paper: Solid Wireframe, Februar 2007, NVIDIA Cooperation Prozedural Prozedural Solid Wireframes - Prozedural Sonderfälle Geometry Shader: „Projektion von Vertices in Viewport Koordinaten“ nicht immer möglich! Lösung 1: Durchschnittliche Größe der Vertices < near Plane Abstand Vektoren ausgehend von Validen zu invaliden Nachbarn Abstandsberechnung zu Vektoren Erfordert Fallunterscheidung im Fragment-Shader Ergebnisse Performantes Rendering geglätteter Linien Liniendicke in px gegeben notwendig? Sonderfälle ungünstig Visuelle Effekte möglich Geometry Shader erforderlich Bildquelle Quelle: Paper und Präsentation: Baerentzen et. al, Single-Pass Wireframe Rendering, SIGGRAPH, 2006 Solid Wireframes – Geometrie basierend ID-Buffer Methode ID-Buffer Methode Zielstellung: Wireframes für N-Gons Linien des Wireframes als Rechtecke rendern Renderpass 1 – Erstellen ID-Buffer Rendern der Geometrie (Farbpuffer Textur) Jedes Primitiv in eigener Farbe Tiefenpuffer: schreiben und Test Renderpass 2 – Rendern der Linienpolygone Tiefenpuffer: nur Test Nur Fragmente erzeugen, wenn ID Buffer übereinstimmt (erfordert projektives Texturemapping) Renderpass 3 – Render der Oberfläche Depth Test = Equal, Blend Color Baerentzen et. al , Two Methods for Antialiased Wireframe Drawing with Hidden Line Removal, In: Proceedings of the 24th Spring Conference on Computer Graphics (SCCG), 2008 Solid Wireframes – Geometrie basierend ID-Buffer Methode - Linienpolygone Geometry Shader: Linienpolygone generieren Input: Linien des Wireframes (Bsp. Kante e2 ) Kante 𝑒2 aus Vertices 𝑣0 , 𝑣1 Höhe von 𝑒2 zum Gegenvertex 𝑣2 Fläche entsprechend der Liniendicke Textur für die Linienfläche Ergebnisse Wireframes in Modelleinheiten Über Textur freie Gestaltung Prinzip übertragbar für NPR Darstellungen Drei Render Passes Performance Erfordert Render-To-Texture! Texture Solid Wireframes – Texture based Textur basierte Methode s=0 s=1 Wireframes mittels 1D Texturen: Primitive rendern (wieder) halbe Wireframe Linien Definition von Texturkoordinaten je Primitiv Dreieck: 0.0 für i-te Texturkomponente des i-ten Vertex, sonst 1.0 Quad: -1 und 1 für gegenüberliegende Kanten (2D Koordinaten) Texturkoordinate [0, abs(min(tex.xyz))] Celes et. al , 2010: Texture-Based Wireframe Rendering, Proceedings of the 23rd Conference on Graphics, Patterns and Images (SIBGRAPI) Solid Wireframe – Texture based Texture-Based Ergebnisse KEIN Shader erforderlich Fragment-Shader ermöglicht Verzicht auf Textur (Glättungsfunktion des ersten Ansatzes) Wegen Textur: Antialiased Liniendicke weder Pixel- noch Unitbasierend (weitestgehend Units) Alternativ: MapMapping für konstante Pixeldichte Attenuation: Mit 2D Texturen denkbar Mapping Prinzip auch für Isolinien (tex.s abhängig von Höhenwerten) Texture MipMap Solid Wireframes Wireframes zusammengefasst Unterschiedliche Methoden der Wireframe-Visualisierung Multi-Pass Wireframes Prozedurale Wireframes Geometrische Wireframes Texture-bases Wireframes Multi-Pass Rendering (mit / ohne Polygon Offset) Höhen Berechnung für Dreiecksvertices ID-Buffer + Generierung texturierter Quads Vorberechnung von Texturkoordinaten Hohe Relevanz in Modellierung und Konstruktion Ausgangsbasis für Illustrative NPR-Darstellungen Unterschiede der Verfahren Art der unterstützten Primitive Einfluss auf die Darstellungsart der Linien Einheit und Verhalten der Liniendicke Solid Wireframes Fragen?