2016-03-23 14 views
2

Ich versuche, ein Objekt in OpenGL (3.3) in einem Drahtmodell-Stil zu rendern, aber nur seine scharfen Kanten (dh wenn die benachbarten Flächennormalen haben ein bestimmter Delta-Winkel) und seine Kontur/Silhouette/Grenze. Meine Datenstruktur ist ein Dreiecksnetz, in dem nur die Dreiecke und ihre Eckpunkte gespeichert sind. Ich habe in "Hardware Determined Edge Features" by Morgan McGuire and John F. Hughes und "Hardware Generated Object Silhouettes" by Michal Valient beide Kanten/face-Normalen/Silhouetten online berechnen untersucht, weshalb beide eine "Workaround" implementieren müssen, um die GPU für die Kantenbestimmung verwenden zu können.Extrahieren Sie scharfe Kanten aus Dreiecksnetz und seine Kontur und rendern Sie es mit OpenGL

Ich dachte, es wäre am besten, einmal die scharfen Kanten offline zu bestimmen und diese Informationen irgendwie für späteres Rendern zu speichern und die Kontur/Silhouette/Grenze des Objekts online abhängig vom Blickwinkel zu bestimmen.

Während meiner Suche stolperte ich über CGAL, Half-Edges, OpenMesh, habe aber keine Erfahrung damit.

Meine Fragen wären:
Wie die scharfen Kanten zu bestimmen? Oder gehen Sie durch das Mesh, erstellen Sie eine Adjazenzliste und testen Sie alle Kanten? (Produktübergreifend, um die Gesichtsnormalen und das Skalarprodukt zu erhalten, um den Winkel zwischen ihnen zu erhalten)
Wie kann man dies gut speichern, um es später leicht wiederzugeben? Erstellen Sie entartete Dreiecke für die stumpfen Kanten? Geht zu viel Information auf diese Weise verloren? Verwenden Sie ein Format, in dem Zeilen gespeichert und gezeichnet werden? Wie man sie dann rendert?

Wie kann ich die Kontur/Silhouette online bestimmen?

Dies ist eine Art von breiter Frage, aber ich hoffe, dass jemand mich in eine Richtung führen kann oder vielleicht sogar schon vorher mit einer der erwähnten Bibliotheken (CGAL, OpenMesh) getan hat.

Antwort

2

Wenn ich nicht falsch liege, hängt eine scharfe Kante immer von einem Standpunkt ab. Sie müssen einen "Standpunkt" haben, um zu entscheiden, ob eine Normale nach vorne oder nach hinten gerichtet ist.

Dies ist, was es oft in Geometrie-Shadern statt nur einmal auf der CPU getan wird (die nicht funktionieren kann, wenn Sie die Kamera verschieben möchten).

Für die Geometrie-Shader-Technik müssen Sie Dreiecke + deren Nachbarschaft senden. Dies kann einmal berechnet werden, nur eine halfedges Struktur mit (die schnelle und einfache Art und Weise), oder Sie können wie

for each triangle t1 
    for each triangle t2 
     if t2 has 2 indices common with t1 then 
      add t2 to t1 adjacency list 
     endif 
    endfor 
endfor 

eine Schleife haben dann Sie Ihre Index-Liste erstellen (die Sie an die GPU senden), um diese Informationen mit , die wie folgt aussehen könnte

for each triangle t1 
    indexList.append(t1.a, t1.b, t1.c) 
    for each triangle t2 in t1 adjacency 
     idx = find the index not common with t1 
     indexList.append(idx) 
    endfor 
endfor 
+0

Vielen Dank für Ihre Antwort. Wie ich es verstehe, bleiben scharfe Kanten scharf, egal, was der "Gesichtspunkt" ist (wenn die Rückseitenkeulung verwendet wird, um die nach hinten gerichteten Teile wegzulassen). Nein? wäre ein guter Weg, um eine Halbkant-Struktur zu erstellen, um benachbarte Flächennormalen einfach zu berechnen und dann die Linien zu speichern, die scharfe Kanten sind, z. eine obj-Datei und rendern über GL_LINES? Nur für die Silhouette wird der "Gesichtspunkt" benötigt, wie z. [hier] (http://ogldev.atspace.co.uk/www/tutorial39/tutorial39.html). Richtig? – Michael

+0

Vielleicht werfen Sie einen Blick auf dieses Papier http://e-collection.library.ethz.ch/eserv/eth:4390/eth-4390-01.pdf (Netzkantenerkennung), um scharfe Kanten zu finden. Sie werden jedoch weiterhin Arbeiten durchführen müssen, um Konturlinien zu erkennen. Was Ihre Anmerkung zur Rückseitenauswurffunktion betrifft, wird dies mit der Dreieckswicklung durchgeführt und hängt von Ihrer Scheitelpunkt-/Geom/Tess-Shaderausgabe ab (https://www.opengl.org/wiki/Face_Culling).Es hängt also indirekt vom Standpunkt ab. – Zouch