Was ich gefunden habe, ist ein festes Gitter kombiniert mit Warnock. Verteile den Bereich des Bildschirms des Modells umfasst (en) im Stumpfes in Zellen:
Dazu kann man einfach das Begrenzungsrechteck der Primitiven verwenden Sie einfügen. Diese Struktur kann ziemlich schnell aktualisiert werden, da Sie nur ganze Zahlen manipulieren müssen, um die Dinge von einer Zelle zur anderen zu bewegen. Um zu vermeiden, ständig Aufteilung und Daten Umschichtungen vorzunehmen, verwenden Sie einen Ansatz freie Liste:
nun jede Gitterzelle machen, wenn es „einfach genug“ (Warnock Kriterien). Wenn nicht, wenden Sie Warnock an.
Eine Rasterzelle ist "einfach genug", wenn das Rechteck für die Zelle vollständig in den Dreiecken enthalten ist, die Sie für diese Zelle rendern, z. und alle 4 Schnittpunkte für das Rechteck innerhalb eines gegebenen Dreiecks liegen vor allen anderen (haben den minimalen Tiefenwert) ... oder wenn die Zelle leer ist oder nur ein Primitiv hat.
Das gesagt, ich mache das nicht wirklich für Echtzeitanzeigezwecke. Es könnte ziemlich schwierig sein, dies in komplexen Netzen in Echtzeit effizient genug zu tun.
Ich mache hauptsächlich Dinge wie z. B. Marquee und Lasso, wählen Sie Scheitelpunkte/Kanten/Polygone in 3D-Software auf sehr dichten Gittern aus, wo wir nicht unklare Primitive durch Approximation mit einer festen Pixelauflösung verpassen wollen. In diesem Fall könnte der Benutzer weit weg von einem Netz herauszoomen und wir möchten nicht, dass unsere Lasso und Auswahlmöglichkeiten eine ganze Reihe von Subpixel-Primitiven verpassen, so dass die Verwendung des auflösungsunabhängigen Warnocks hier rekursiv ist Wenden Sie den Algorithmus so tief an, wie Sie benötigen, bis Sie das Ergebnis "einfach genug" erhalten, das ein Rechteck sein könnte, das viel kleiner als ein Pixel ist. Es könnte auch nützlich sein für Antialiasing mit einigermaßen effizienter Unterabtastung (da es keine Unterabtastung durchführt, wenn beispielsweise ein Pixel eine vollständige Abdeckung aufweist). Ich habe das nie für Rasterisierungskontexte verwendet.
Raytracing macht auch Spaß wegen all der Möglichkeiten, die es bis hin zu indirekter Beleuchtung, Ätzmittel, DOF usw. eröffnet, obwohl es sehr rechenintensiv ist, wie Karel betont. Das heißt, ich habe mit einem guten BVH herausgefunden, dass ich in der heutigen Zeit mit ziemlich hoher Auflösung in Echtzeit Raytracing machen kann, wenn ich nur hauptsächlich direktes Licht mache.
Hier ist ein kleines Beispiel, das ich aus Raytracing einer Million Dreiecksnetz in Echtzeit auf der CPU ausgegraben, die ich von einigen Jahren gepeitscht habe. Das war auf meinem i3 und bei 1600x1200 Pixel. Es hat nur einen Tag gedauert, um es zu programmieren. Die GIF herabgestuft wirklich die Qualität und Bildrate (ursprünglich über ~ 120 FPS), aber hoffentlich bekommen Sie die Idee:
Der größte Nachteil für mich mit Echtzeit-Raytracing auf CPU (sowie GPU) ist eigentlich nicht der Rasterungsteil.Während ich Grundmaterialien und Beleuchtung in Echtzeit ziemlich einfach mit einem i3 rendern konnte (und dies war nicht einmal optimierter Code, nur einige grundlegende SIMD und parallele Schleifen in C), wäre es viel schwieriger, wenn dieses Million Dreiecksnetz alle deformiert würde Rahmen. Dann müsste ich in der Lage sein, den BVH zu aktualisieren, der über eine Million Dreiecke mit über 100 FPS speichert, von denen ich nicht weiß, wie ich schnell genug vorgehen soll.
Das heißt, es gibt eine Software, die tatsächlich Millionen von Polygonen rasterisiert, die Daten in Echtzeit verformen. Es heißt ZBrush:
Ich habe keine Ahnung, wie sie es aber verwalten. Sie können LOD oder Voxelize super schnell verwenden, während Benutzer es mit einem Pinsel oder etwas deformieren; Für mich ist das nicht wirklich wichtig, da Sie die Dinge auf der Ebene pro Vertex, pro Polygon-Ebene steuern können, lassen Sie Drahtmodelle sehen und lassen Sie polygonale Netze beim Laden und Speichern eingeben und ausgeben. Wie auch immer, es hat den Effekt, Millionen von Polygonen Daten zu verarbeiten (es gelang sogar, Netze zu rippen und zu verformen, die vor 17 Jahren über 20 Millionen Polygone spannen, was beispiellos ist; Benutzer, um die Ergebnisse zu formen und die Dinge irgendwie auf einer Vertex-Ebene zu steuern, während interaktive Bildraten beibehalten werden, ohne die GPU für die Rasterung zu verwenden. Sie haben eine Art Voodoo-Programmierung, so weit ich es sehe, aber ich könnte einen Finger tauschen, um herauszufinden, wie sie das machen.
Segment-Pufferung und Wornock-Algorithmus sehen vielversprechende Kandidaten aus. Ich werde sehen, welche ich implementieren kann. Vielen Dank für die ausführliche Antwort. Ich benutze bereits die Rückseitenkeulung in der orthographischen Projektion, aber ich glaube, dass es bei der perspektivischen Projektion nicht genau funktioniert. – Jayesh
@Jayesh: Die Rückseitenkeulung funktioniert auch für die perspektivische Projektion (wenn die anderen in meiner Antwort genannten Bedingungen erfüllt sind). –
Aah. Dein Kommentar hat mich zum Nachdenken gebracht und ich denke, ich weiß jetzt, warum die Rückseitenkeulung für mich in der perspektivischen Projektion nicht funktioniert. Ich benutze im Extremfall die Tatsache, dass alle meine Würfel die gleiche Orientierung haben. So sind zu jeder Zeit nur 3 ihrer Gesichter sichtbar. Im orthogaphischen Modus sind dies die gleichen 3 Gesichter für alle Würfel. Aber es traf mich gerade, dass für die perspektivische Projektion das nicht stimmt, und ich sollte versteckte Rückseiten für jeden Würfel separat berechnen. Ich muss es überprüfen, aber ich denke, das ist es. Glauben Sie, dass eine genaue Z-Sortierung überflüssig wird? – Jayesh