-
HINTERGRUND
-
Die vorliegende Erfindung betrifft ein Verfahren zur hierarchischen Netzquantisierung für speichereffizientes Raytracing.
-
Raytracing wurde sowohl beim Offline Rendering als auch bei interaktiven Anwendungen zunehmend wichtiger. Seine Flexibilität und fotorealistische Bildqualität machen Raytracing zum bevorzugten Algorithmus bei der Lösung von Problemen, wie z. B. dem globalen Beleuchtungsproblem. Seine Eignung zum Echtzeit-Rendering wurde in den letzten Jahren gezeigt. Die Leistung moderner Raytracer kann mit Rasterung für viele Szenarien mithalten und kann robuster und leichter in der Anwendung sein. Mit aufkommenden voll programmierbaren Grafikarchitekturen können die verbleibenden Vorteile der klassischen, auf Rasterung basierenden Rendering-Pipelines schwinden.
-
Ein Problem des Raytracings ist jedoch, dass eine optimale Leistung nur erzielt werden kann, wenn die gesamte Szene in den Gerätespeicher passt. Die meisten interaktiven Raytracing-Implementierungen nutzen grosszügig Speicherplatz, da dieser Ansatz hohe Bildfrequenzen liefert. Dies stellt ein Problem bei praktischen Anwendungen dar, nirgendwo mehr als bei Grafikkarten mit schnellem, aber beschränktem Speicherplatz.
-
Das Zögern dabei, Datenkomprimierung für schnelles Raytracing zu verwenden, ist auf den Einfluss auf die Leistung der meisten Komprimierungsalgorithmen und die fehlende Unterstützung für Direktzugriff zurückzuführen. Sequenzielle Dekomprimierung des gesamten Datensatzes vor einem Rendering könnte keine Option sein. Kürzlich entwickelte Algorithmen machen einen Schritt in die richtige Richtung, aber entweder erzielen sie nur mässige Komprimierungsraten oder sie erfordern eine blockweise Dekomprimierung der Datenstrukturen mit Caching. Beide Einschränkungen sind beim Echtzeit-Raytracing sehr grosser Modelle auf Geräten mit eingeschränktem Speicherplatz problematisch.
-
T. Kim, B. Moon, D. Kim, and S. Yoon. RACBHs: Random-Accessible Compressed Bounding Volume Hierarchies. IEEE Transactions an Visualization and Computer Graphics, vol. 16, no. 2, March/April 2010; published online 17 June 2009, offenbart Codieren von Eckpunktpositionen von Dreiecken als Bitfolgen variabler Länge, Modellieren der Konnektivität der Dreiecke und Gestalten einer kompakten Bounding-Volume-Hierarchie, die zumindest einen Teil einer Szene darstellt. Das bekannte Verfahren wird von einem Prozessor durchgeführt, der zur Durchführung von Graphikverarbeitung konfiguriert ist.
-
Aus SHAFFER, Eric; GRALAND, Michael. Efficient adaptive simplification of massive meshes. In: Proceedings of the conference in Visualization '01. IEEE Computer Society, 2001. S. 127–134, ist Quantisieren von Dreiecken einer Szene auf einem globalen Raster, so dass angrenzende Dreiecke ineinander einrasten, bekannt.
-
Aus der
US 020080192050 A1 und der
US 6525722 B1 ist jeweils eine Datenstruktur für eine Boundingbox mit Deltavektoren von dessen Ursprung zu den Eckpunkten der Dreiecke bekannt, wobei die maximal benötigte Anzahl der Bits bestimmt wird, um die Deltavektoren zu kodieren, und diese Anzahl den Deltavektoren vorangestellt wird.
-
Der vorliegenden Erfindung liegt somit die Aufgabe zugrunde, für ein speichereffizientes Raytracing zu sorgen.
-
Erfindungsgemäß wird diese Aufgabe durch ein Verfahren nach Anspruch 1 sowie ein Computerprogramm-Produkt nach Anspruch 7 gelöst.
-
Die Unteransprüche betreffen vorteilhafte Weiterentwicklungen des erfindungsgemäßen Verfahrens.
-
KURZE BESCHREIBUNG DER ZEICHNUNGEN/FIGUREN
-
1 ist ein Ablaufdiagramm, das die hierin beschriebene Gesamtverarbeitung gemäss einer Ausführungsform veranschaulicht.
-
2 zeigt die Platzierung von Dreiecken auf einem globalen Raster gemäss einer Ausführungsform.
-
3 ist ein Ablaufdiagramm, das die Codierung von Eckpunktpositionen als Bitfolgen gemäss einer Ausführungsform veranschaulicht.
-
4 veranschaulicht die Codierung von Eckpunkten, wobei gemäss einer Ausführungsform die nächste Bounding Plane von einem zusätzlichen Bit angegeben werden kann.
-
5 ist ein Ablaufdiagramm, das die Verwendung einer Nachschlagetabelle zur Modellierung der Konnektivität von Dreiecken gemäss einer Ausführungsform veranschaulicht.
-
6 veranschaulicht die Verwendung ungerichteter Ladevorgänge zur Eckpunkt-Decodierung gemäss einer Ausführungsform.
-
7 ist ein Ablaufdiagramm, das die Gestaltung einer kompakten Bounding-Value-Hierarchie gemäss einer Ausführungsform veranschaulicht.
-
8 veranschaulicht das Layout einer Bounding-Value-Hierarchie, wobei Kindknoten gemäss einer Ausführungsform zu Blöcken organisiert sein können.
-
9 veranschaulicht eine Software- oder Firmware-Implementierung der hierin beschriebenen Verarbeitung gemäss einer Ausführungsform.
-
AUSFÜHRLICHE BESCHREIBUNG
-
Eine bevorzugte Ausführungsform wird nun unter Bezugnahme auf die Figuren beschrieben, bei denen gleiche Bezugsnummern identische oder funktional ähnliche Elemente angeben.
-
Ebenfalls bei den Figuren entspricht die ganz linke Ziffer einer jeden Bezugsnummer der Figur, bei der die Bezugsnummer zum ersten Mal verwendet wird. Obwohl spezifische Konfigurationen und Anordnungen erörtert werden, sollte es selbstverständlich sein, dass dies lediglich zum Zwecke der Veranschaulichung erfolgt. Ein Fachmann wird erkennen, dass weitere Konfigurationen und Anordnungen verwendet werden können, ohne vom Sinn und Umfang der Beschreibung abzuweichen. Für einen Fachmann ist es selbstverständlich, dass dies ebenfalls bei vielerlei anderen Systemen und Anwendungen, die sich von dem hierin beschriebenen unterscheiden, eingesetzt werden kann.
-
Die hierin beschriebenen Verfahren und Systeme können ein Dreiecksnetz und seine Bounding-Volume-Hierarchie (bounding volume hierarchy, BVH) in einer kompakten hierarchischen Datenstruktur speichern. Die BVH kann als eine Beschleunigungsstruktur und als eine hierarchische, komprimierte Darstellung von Dreiecksnetzen verwendet werden. Dies macht sich den Umstand zunutze, dass eine BVH eine Annäherung des Dreiecksnetzes darstellen kann. Die Eckpunkte des Netzes können als quantisierte Werte innerhalb der BVH-Blatter mit wenigen Bit gespeichert werden.
-
Eine Quantisierung der Eckpunktpositionen innerhalb der Blattknoten kann jedoch zu Lücken zwischen benachbarten Dreiecken führen, wenn sie sich in unterschiedlichen Blättern befinden. Dies geschieht, da die Quantisierungspositionen innerhalb zweier Blattknoten nicht ausgerichtet sein könnten. Bei einer Ausführungsform kann dieses Problem mit einem globalen Quantisierungsraster gelöst werden, bei dem alle Blattknoten an diesem Raster ausgerichtet sein können. Die Dreieckseckpunkte können in dasselbe Raster einrasten und ihre Position kann als ein Ganzzahl-Offset zu dem Ursprung ihrer entsprechenden Bounding Box gespeichert werden. Die Ganzzahlpositionen innerhalb eines Blattknotens können typischerweise einen kleinen Bereich aufweisen und können für eine Komprimierung zugänglich sein.
-
Die Ganzzahlwerte könnten mit einem aggressiven Komprimierungsalgorithmus, wie beispielsweise Huffman-Codierung oder arithmetischer Codierung, codiert werden. Bei einer Ausführungsform können die Daten in Bitfolgen gespeichert werden. Eine optimierte Entpackfunktion kann verwendet werden, um sie kostengünstig zu decodieren.
-
Zusätzlich zu den Eckpunktpositionen kann die Eckpunkt-Konnektivität komprimiert sein. Die Dreiecke können lokal innerhalb der BVH-Knoten als Streifen oder indizierte Streifen, je nachdem welche Variante kleiner ist, gespeichert werden. Wie im Falle der quantisierten Positionen können die Eckpunktindizes einen kleinen Bereich aufweisen und können komprimiert werden.
-
Die Bonnding-Volume-Hierarchie selbst kann ebenfalls in einem kompakten Format gespeichert werden. Die BVH-Knoten können quantisiert werden. Zusätzlich können die Knoten in Cluster gespeichert werden. Auf diese Art und Weise können die Kindzeiger einen lokalen Offset in dem Cluster darstellen, der lediglich wenige Bit erfordern kann. Insgesamt kann die Grösse eines BVH-Knotens von 32 Byte auf beispielsweise 4 Byte verringert werden. Im Allgemeinen gibt es keine Beschränkungen bei einem BVH-Gestaltungsalgorithmus, sodass ein herkömmlicher Builder verwendet werden kann.
-
Eine Gesamtverarbeitung ist in 1 gemäss einer Ausführungsform veranschaulicht. Bei 110 können die Dreiecke eines Modells auf einem globalen Raster quantisiert und eingerastet sein. Dies kann auf eine Art und Weise erfolgen, die Lücken eliminiert, die ansonsten erscheinen können, wenn die Dreiecke auf entsprechenden lokalen Raster quantisiert wären. Bei 120 sind die Positionen der Eckpunkte der Dreiecke als Bitfolgen codiert. Dies wird auf eine Art und Weise durchgeführt, die die Anzahl an Bit minimiert, die erforderlich ist, um die Eckpunkte darzustellen. Bei 130 wird die Konnektivität der Dreiecke modelliert. Bei einer Ausführungsform kann dies durchgeführt werden, indem angenommen wird, die Dreiecke seien Streifen, wie nachstehend ausführlicher beschrieben wird. Bei 140 kann ein Teil des Modells oder das gesamte Modell in einer BVH dargestellt werden. Bei einer Ausführungsform kann die BVH auf eine kompakte Art und Weise gestaltet sein, was nachstehend ausführlicher beschrieben werden soll. Der Prozess kann bei 150 enden.
-
Quantisierung auf einem globalen Raster
-
Die Positionierung von Dreiecken auf einem globalen Raster ist in 2 gemäss einer Ausführungsform veranschaulicht. Wenn ein Shape als ein Satz an Dreiecken im Kontext einer Bounding-Volume-Hierarchie modelliert wird, können Spalten oder Lücken in der Geometrie erscheinen, wenn individuelle Polygone auf lokal quantisierten Raster platziert werden. Dies kann verhindert werden, indem alle Dreieckseckpunkte und Blatt-Bounding-Boxen in dasselbe globale Raster einrasten. Die Veranschaulichung 210 ganz links zeigt einen Satz angrenzender Dreiecke, bei denen die Eckpunkte unquantisiert und ohne Platzierung auf einem Raster bleiben. Die mittige Veranschaulichung 220 zeigt Dreiecke, die jeweils auf ihrem eigenen lokalen Raster platziert und quantisiert sind. Ein Mischen der Dreiecke kann zu Lücken zwischen Dreiecken führen, die verbunden sein sollen. Diese Lücken, wie z. B. Lücke 225, können Artefakte lokaler Quantisierung darstellen. Bei einer Ausführungsform kann ein globales Raster verwendet werden, bei dem Dreiecke einrasten können, sodass Lücken eliminiert werden. Dies ist bei der Veranschaulichung 230 ganz rechts gezeigt. Hier kann Lücke 225 eliminiert werden. Es ist zu beachten, dass im Kontext einer BVH die global eingerasteten Bounding Boxen nicht gespeichert werden müssen, da sie spontan zur Dekomprimierung der Eckpunkte eingerastet werden können.
-
Codierung von Eckpunktpositionen
-
Um zusätzlichen Speicherplatz zu sparen, können Bitfolgen verwendet werden, um Dreieckseckpunkte zu spezifizieren. Bei einer Ausführungsform können die Eckpunktpositionen bezüglich eines Bounding Box Ursprunges O codiert sein. Daher können die Deltavektoren (Di = {xi, yi, zi}), wenn ein Satz an Eckpunkten (Ai) zum Codieren gegeben ist, zuerst aus O für jeden entsprechenden Eckpunkt in Ai berechnet werden. Dann kann die Anzahl an Bit (nx, ny, nz), die erforderlich ist, um je max(xi), max(yi), max(zi) zu codieren, berechnet werden. (nx, ny, nz) stellt die Gesamtanzahl an Bit n bereit, die maximal für jede Koordinate eines jeden Eckpunkts erforderlich ist, und kann zu einem variablen Bit-Codierschema führen. Bei einer Ausführungsform ist die für jeden Eckpunkt erforderliche Anzahl (nx, ny, nz) an Bit in der Bitfolge codiert. Die Eckpunktdaten können anschliessend eingereiht werden.
-
Die Codierung von Eckpunkten ist in 3 gemäss einer Ausführungsform veranschaulicht. Bei 310 kann für jeden Eckpunkt ein Deltavektor Di = {xi, yi, zi} berechnet werden, wobei jede Komponente dieses Vektors den Abstand in der Dimension vom Ursprung der Bounding Box zu dem Eckpunkt beschreibt. Bei 320 können die grössten Werte für jede Dimension über alle der Eckpunkte Ai bestimmt werden. Diese Maximalwerte sind als max(xi), max(yi) und max(zi) gezeigt. Bei 330 kann die Anzahl an Bit, die zum Codieren eines jeden dieser Maximalwerte benötigt wird, bestimmt werden. Dies führt zu drei Werten (nx, ny, nz), die diese Maximalwerte darstellen. Bei 340 können diese Werte (nx, ny, nz) in einer Bitfolge, gefolgt von den Eckpunktdaten für Ai, platziert werden. Der Prozess kann bei 350 enden.
-
Eine Technik zum Codieren der Eckpunktdaten innerhalb einer Bounding Box kann darin bestehen, den ganzzahligen Deltavektor aus dem Ursprung zu berechnen. Die Blatt-Bounding-Boxen sind jedoch die derzeitigen Bounding Boxen der Eckpunkte, die sie enthalten. Da sich einige Eckpunkte an oder in der Nähe der Flächen der Bounding Boxen befinden, kann eine Berechnung der Deltawerte von der nächsten Ebene (anstatt von dem Ursprung) zu kleineren Deltavektoren führen, die mit weniger Bit dargestellt werden könnten.
-
Aus diesem Grund kann bei einer Ausführungsform ein zusätzliches Bit für jede Komponente des Deltavektors hinzugefügt werden, um die nächste Ebene, von der der Abstand gemessen wird, zu identifizieren. Dies kann die finale Grösse (d. h. Anzahl an Bit) der Eckpunktdaten verringern. Dies kann insbesondere bei Modellen nützlich sein, die viele grosse Dreiecke enthalten. Bei dem zweidimensionalen Beispiel von 4 kann ein Deltavektor für jeden Eckpunkt erzeugt werden, einschliesslich Eckpunkt D. Hier kann für jeden gegebenen Eckpunkt xmin verwendet werden, um den Abstand von dem Eckpunkt zu dem Ursprung O (als 405 gekennzeichnet) in x-Richtung zu bestimmen. Die Variable ymin kann verwendet werden, um den Abstand von dem Ursprung 405 zu D in y-Richtung zu bestimmen. Für den Eckpunkt D würde die nächste ”Ebene” in y-Dimension der oberen Grenze 410 entsprechen; die nächste ”Ebene” in x-Richtung würde der Grenze 420 ganz rechts entsprechen. Eckpunkt D würde daher als (xmax D, ymax D) codiert, wobei diese Koordinaten die Abstände von der oberen Grenze 410 bzw. von der Grenze 420 ganz rechts darstellen. Ein zusätzliches Bit kann dann für jede Koordinate hinzugefügt werden, um die nächste Grenze zu identifizieren. Im Falle der ersten Koordinate würde ihr zusätzliches Bit entweder die obere oder untere Grenze bezeichnen; im Falle der zweiten Koordinate würde ihr zusätzliches Bit entweder die rechte oder die linke Grenze bezeichnen.
-
Ein Decodieren der Eckpunktdaten kann darin bestehen, dass die Anzahl an Bit gelesen wird, die für jede Komponente erforderlich ist, und die Eckpunktdaten decodiert werden.
-
Es sollte selbstverständlich sein, dass 4 der Einfachheit halber und zur vereinfachten Veranschaulichung ein zweidimensionales Modell veranschaulicht. Dieses Beispiel könnte auf einen dreidimensionalen Fall ausgeweitet werden, bei dem die Grenzen anstelle von Liniensegmenten Ebenen wären. Zusätzlich zu den x- und y-Koordinaten wäre ebenfalls eine z-Koordinate vorhanden, um jeden gegebenen Eckpunkt zu codieren.
-
Dreiecks-Konnektivität
-
Dreiecks-Konnektivität kann ebenfalls modelliert werden. Es gibt mehrere Wege, um dies zu erreichen. Bei einem Verfahren können drei Eckpunktpositionen pro Dreieck gespeichert werden, wobei gemeinsam benutzte Eckpunkte verdoppelt werden. In Anbetracht des in 4 bereitgestellten Blattbeispiels kann die Sequenz der Eckpunktposition {ABE, EBD, CED} direkt codiert werden. Eine weitere Möglichkeit ist, ein Array von Eckpunktpositionen zu speichern und dann drei Indizes pro Dreieck zu speichern, wobei sich die Indizes auf die in dem Array identifizierten Eckpunktpositionen beziehen können. Im Fall von 4 kann {ABCDE} für die Eckpunktdaten gespeichert werden. Indizes können definiert werden, z. B. 0 für den ersten identifizierten Eckpunkt (A), 1 für den zweiten identifizierten Eckpunkt (B), etc. Demzufolge kann {[0, 1, 4], [4, 1, 3], [2, 4, 3]} verwendet werden, um die Dreiecke zu benennen. [0, 1, 4] stellt beispielsweise das Dreieck ABE dar.
-
Eine andere Art und Weise, Dreiecks-Konnektivität zu modellieren ist, angrenzende Dreiecke als Streifen zu betrachten. Durch eine Verwendung von Streifen oder indizierten Streifen kann die Möglichkeit bereitgestellt werden, Blattgrössen und Decodierzeiten zu verringern. Ein Streifensystem für ein in einem Blatt enthaltenes Dreiecksnetz wird bei einer Ausführungsform verwendet. Solch ein System kann Dreiecksnetz-Layouts bei Blättern verarbeiten, z. B. ein Streifen von vier Dreiecken gefolgt von einem Streifen von drei Dreiecken gefolgt von einem Dreieck. Dieser Ansatz kann eine Nachschlagetabelle (look-up table, LUT) verwenden, die automatisch generiert werden kann, und kann wie folgt gestaltet sein:
- – Beschränkung der maximalen Anzahl an Dreiecken pro Blatt (beispielsweise 14);
- – jeder Eintrag der LUT verarbeitet ein Netz-Layout. Eintrag STRIP3X3_STRIP2X3_TRIX4 verarbeitet beispielsweise ein Layout, das aus drei Streifen von drei Dreiecken besteht, dann drei Streifen von zwei Dreiecken und dann vier Dreiecke
- – um die Anzahl an Einträgen zu beschränken, werden die Streifen nach ihrer Grösse geordnet. Daher wäre STRIP4X1_STRIP3X3 ein gültiger Eintrag, während STRIP3X3_STRIP4X1 es nicht wäre
- – für jeden Eintrag die Anzahl an Dreiecken und die Offsets ihres ersten Eckpunkts speichern. Eintrag STRIP3X1_TRIX2 beispielsweise setzt sich aus fünf Dreiecken und den fünf Dreiecks-Offsets, {0, 1, 2, 5, 8}, zusammen
- – Streifen wechseln Dreiecke im Uhrzeigersinn und gegen den Uhrzeigersinn ab; Speichern der Ausrichtung eines jeden Dreiecks.
-
Die LUT kann unabhängig sein von der Verwendung von Streifen oder indizierten Streifen. Wenn das Blatt Dreiecksstreifen speichert, können die von der Tabelle bereitgestellten Offsets den Offset der Eckpunktpositionen ergeben. Umgekehrt kann die Tabelle, wenn das Blatt indizierte Streifen speichert, den Offset der Eckpunktindizes bereitstellen. Während einer Komprimierung können sowohl Streifen als auch indizierte Streifen berechnet werden, und lediglich die kleinere Darstellung kann behalten werden. Die Blätter können dann mit einem zusätzlichen Bit markiert werden, um das Vorhandensein von Streifen oder indizierten Streifen anzugeben.
-
Eine der Verwendung von Streifen zur Modellierung von Dreiecks-Konnektivität verwandte Verarbeitung ist, gemäss einer Ausführungsform, in 5 veranschaulicht. Bei 510 kann eine Anzahl gewählt werden, die eine Beschränkung für die Anzahl an Dreiecken darstellt, die in einem einzelnen Blatt enthalten sein können. Bei 520 kann eine Nachschlagetabelle erzeugt werden, wobei jeder Eintrag einem einzelnen Netz-Layout entspricht. Bei 530 können Streifen, nach Grösse geordnet, in jedem Eintrag gespeichert werden. Bei 540 können die Anzahl an Dreiecken und die Offsets eines jeden ersten Eckpunkts bei jedem Eintrag gespeichert werden. Bei 550 können die Ausrichtungen der Dreiecke gespeichert werden. Der Prozess kann bei 560 enden.
-
Decodierung
-
Um den Decodierungsschritt bei bestimmten Architekturen zu beschleunigen, können bei einer Ausführungsform die Möglichkeiten eines ungerichteten Ladens einer Zielarchitektur verwendet werden. Ein Beispiel solch einer Architektur ist die ×86 Architektur. Chips wie z. B. diejenigen bei der ×86 Familie können hinsichtlich Speicherladevorgängen besonders nachsichtig sein. Hier können die 64-Bit-Quadwords unabhängig von ihrer Ausrichtung auf folgende Art und Weise geladen werden:
Berechnung der maximalen Anzahl pn = [64/n] an Eckpunkten, die in ein Quadword passen, für eine Anzahl an Bit n, die benötigt wird, um jeden Eckpunkt darzustellen. Speichern von Eckpunkten unter Verwendung nicht ausgerichteter Sequenzen von pn Eckpunkten.
-
Der letzte Schritt ist bei der Ausführungsform von 6 veranschaulicht: hier entspricht n 44 Bit und pn entspricht 1. Ein 44-Bit-Eckpunkt kann codiert werden und vier Bit können freigelassen werden, um an einer Bytegrenze zu enden. Insgesamt werden daher 48 Bit dem Eckpunkt zugeordnet. Nach dem Beginn des Vorhergehenden, können bei dem nächsten Eckpunkt sechs Byte codiert werden (48 Bit = (8 Bit pro Byte)·(6 Byte)).
-
Da jede Sequenz von pn Eckpunkten nun auf einem neuen Byte beginnt, ist der Decodierungsschritt verbessert, wobei die zugrunde liegende Architektur schnelle ungerichtete Ladevorgänge unterstützt. Für eine schnelle Decodierung kann zuerst eine Nachschlagetabelle (look-up table, LUT) berechnet werden, wobei die LUT zwei Werte für jede Eckpunktsgrösse n ε [1 ... 64] speichert: die Anzahl an Eckpunkten pn, die innerhalb eines Quadwords gespeichert werden können, und den Offset sn in Byte relativ zu der Stelle des nächsten/der nächsten zu decodierenden Eckpunktes/Eckpunkte.
-
Der Decodierungsschritt kann wie folgt ablaufen, wobei q das Quadword ist, von dem aus eine Decodierung derzeit stattfindet:
- 1. Decodierung von pn Eckpunkten aus q. Da alle Eckpunkte in q passen, kann diese Operation eine Sequenz von SHIFT- und UND-Befehlen erfordern
- 2. Laden des nächsten Quadwords, das sich sn Byte nach q befindet.
-
Um den Decodierungsschritt zu verbessern, können ganzzahlige SIMD-Operationen verwendet werden. Sobald die Deltawerte von der Bitfolge erhalten werden, kann ein zweigloser Code mittels SIMD-Operationen die ganzzahligen eingerasteten Positionen abrufen und dann gemäss einer Ausführungsform die Orte der World-Space-Gleitkommazahlen mittels des Ursprungs und der Zellgrösse des Einrastrasters berechnen. Ein Beispiel von Pseudocode der Eckpunktdaten-Decodierung ist in Anhang A bereitgestellt.
-
BVH-Baum-Layout
-
Im Folgenden wird eine BVH mit zwei Ebenen beschrieben, die sowohl komprimierte als auch unkomprimierte Knoten verwenden kann; hierarchische Quantisierung, die Speicherplatzverbrauch durch Bounding Boxen verringern kann; und Blockzuordnung und Block-bezogene Indizes, die die Grösse an Referenzierungen auf Kindknoten verringern kann. Die Verarbeitung ist in 7 gemäss einer Ausführungsform veranschaulicht. Bei 710 kann hierarchische Codierung verwendet werden, um die Position von Kind-Bounding-Boxen, d. h. Kindknoten, auszudrücken. Die minimalen und maximalen Positionen der Kind-Bounding-Boxen können relativ zu ihren Elternknoten ausgedrückt werden. Offsets können verwendet werden, um die Orte von Ecken einer Kind-Bounding-Box zu definieren, wobei sich die Offsets relativ zu einem Punkt (wie z. B. dem Ursprung) der Elternbox befinden. Wenn lediglich vier Bit verwendet werden können, um jede Kind-Bounding-Box-Komponente zu codieren, entspricht der Speicherbedarf der Bounding Box 24 Bit. Bei einer Ausführungsform ermöglicht es daher die Verwendung von vier Byte (32 Bit) pro Knoten acht Bit, die Kindknoten zu indizieren und, wie im nächsten Abschnitt beschrieben, zusätzliche Information zu codieren.
-
Bei 720 können Kindknoten zu Blöcken gruppiert werden. Wie bei der Ausführungsform von 8 gezeigt, können zwei Systeme zur Indizierung verwendet werden. Innerhalb eines Blocks können wenige Bit verwendet werden, um die Kinder zu indizieren. Bei 8 können beispielsweise kleine Indizes verwendet werden, um Knoten N aus Root-Knoten R zu indizieren. Um ein Kind ausserhalb des derzeitigen Blockes zu referenzieren, kann eine 4-Byte-Ganzzahl in einem dedizierten Weiterleitknoten gespeichert werden. Bei der Veranschaulichung kann durch Bodenknoten B auf Weiterleitknoten F gezeigt werden. Weiterleitknoten F selbst können auf Block-Roots R zeigen, wobei diese Roots R Roots von entsprechenden Unterbäumen sind.
-
Unter Verwendung dieses Layouts kann ein 4-Byte-Knotenformat derart aufgebaut werden, dass:
- – 24 Bit für die Bounding Box verwendet werden können (siehe Anhang B).
- – 6 Bit können verwendet werden, um die Kindknoten zu indizieren
- – 2 Bit können verwendet werden, um Blattknoten und die drei internen Knotentypen X, Y, Z, die erforderlich sein können, um die beiden Kinder zu ordnen, zu unterscheiden.
-
Bei 730 können Blattdaten mit Baumknoten verschachtelt sein. Bei einer Indizierung der Blattdaten (wie Dreiecksindizes oder Eckpunktpositionen) kann eine Verwendung von ein oder mehr 4-Byte-Indizes teuer sein. Wie bei der Ausführungsform von 8 gezeigt, können verschachtelte Blattdaten und Baumknoten Referenzierungen auf externe Arrays vermeiden. Durch Einreihen der Blattdaten nach jedem Block können die Blattdaten relativ zu dem Blattort in einem Speicher angegeben werden.
-
Bei 740 können Bodenknoten in der BVH komprimiert sein, wobei zumindest ein Teil der oberen Knoten unkomprimiert bleibt. Da die meisten Strahlen obere Knoten queren, kann dies den Einfluss auf die Leistung beschränken, während ein kleiner Speicherbedarf aufrechterhalten wird. Der Prozess kann bei 750 enden.
-
Implementierung
-
Die vorstehend beschriebene Verarbeitung kann in Hardware, Firmware oder Software oder irgendeiner Kombination davon implementiert sein. Zusätzlich können jegliche ein oder mehr hierin offenbarte Merkmale in Hardware, Software, Firmware und Kombinationen davon implementiert sein, einschliesslich separater und integrierter Schaltkreislogik, anwendungsspezifischer integrierter Schaltkreis-(application specific integrated circuit, ASIC)-Logik und Mikrocontrollern, und können als Teil eines Domainspezifischen integrierten Schaltkreisgehäuses oder einer Kombination von integrierten Schaltkreisgehäusen implementiert sein. Der Begriff Software, wie hierin verwendet, bezieht sich auf ein Computerprogramm-Produkt, einschliesslich eines computerlesbaren Mediums, in dem Computerprogrammlogik gespeichert ist, um ein Computersystem zu veranlassen, ein oder mehr Merkmale und/oder Kombinationen von Merkmalen, die hierin offenbart sind, auszuführen. Ein Computerprogramm-Produkt kann beispielsweise eine Compact Disk, Flash-Memory oder einen Festspeicher (read-only memory, ROM) oder ein anderes Permanentspeichergerät umfassen.
-
Eine Software- oder Firmwareausführungsform der vorstehend beschriebenen Verarbeitung ist in 9 veranschaulicht. System 900 kann einen Prozessor 920 und einen Speicherkörper 910 beinhalten, der ein oder mehr computerlesbare Medien beinhalten kann, die Computerprogrammlogik 940 speichern können. Speicher 910 kann als eine Festplatte und Laufwerk, ein Wechseldatenträger, wie z. B. eine Compact Disk und Compact Drive, oder beispielsweise ein ROM-Gerät implementiert sein. Prozessor 920 und Speicher 910 können mittels einer von vielen Technologien, die einem Fachmann bekannt sind, wie z. B. einem Bus, in Kommunikation stehen. In Speicher 910 enthaltene Logik kann von Prozessor 920 gelesen und ausgeführt werden. Ein oder mehr Eingabe-/Ausgabe-(I/O)-Ports und/oder Eingabe-/Ausgabe-(I/O)-Geräte, insgesamt als I/O 930 gezeigt, können ebenfalls mit Prozessor 920 und Speicher 910 verbunden sein.
-
Computerprogrammlogik kann Module 950–970 gemäss einer Ausführungsform beinhalten. Rasterlogik 950 kann für eine Quantisierung von Dreiecken auf einem globalen Raster verantwortlich sein, sodass die Dreiecke einrasten. Codierte Logik 960 kann verantwortlich sein für eine Codierung der Eckpunktpositionen als Bitfolgen und für eine Codierung einer Dreiecks-Konnektivität, wie vorstehend beschrieben. BVH-Logik 970 kann verantwortlich sein für eine Gestaltung einer BVH und einer kompakten Art und Weise, wie vorstehend beschrieben.
-
Verfahren und Systeme werden hierin mithilfe funktionaler Bausteine offenbart, die deren Funktionen, Merkmale und Beziehungen veranschaulichen. Zumindest einige der Grenzen dieser funktionalen Bausteine wurden zum besseren Verständnis der Beschreibung hierin willkürlich definiert. Alternative Grenzen können definiert werden, solange deren spezifizierte Funktionen und Beziehungen angemessen durchgeführt werden. Anhang A Schnelle Decodierung von Eckpunktdaten.
Anhang B Schnelle komprimierte Knotendecodierung
-