# REYES (Computergrafik)

Die REYES-Architektur ist ein Bildsynthese-Algorithmus, der in der 3D-Computergrafik verwendet wird, um fotorealistische Bilder zu berechnen. Er wurde Mitte der 1980er Jahre von der Lucasfilms Computer Graphics Research Group entwickelt, die nun unter dem Namen Pixar bekannt ist.
Zum ersten Mal wurde REYES für den Kinofilm Star Trek II: Der Zorn des Khan eingesetzt, um Bilder der Genesis-Effektsequenz zu berechnen. Pixars PhotoRealistic RenderMan (kurz PRMan) ist eine Implementierung des REYES-Algorithmus. Nach der ursprünglichen Publikation, die den Algorithmus beschreibt, ist das REYES-Bildsynthesesystem: „Eine Architektur … für das schnelle, hochqualitative Synthetisieren komplexer Bilder.“ Vorgeschlagen wurde REYES als eine Sammlung von Algorithmen und Datenverarbeitungsmethoden. Die Begriffe Algorithmus und Architektur jedoch werden in diesem Artikel als Synonyme verwendet und sind (in diesem Fall) austauschbar.
REYES ist das Backronym für Renders Everything You Ever Saw (sinngemäß übersetzt: Berechnet alles, was du je gesehen hast), der Name ist zudem eine Anspielung auf den Ort Point Reyes, Kalifornien, in dessen Nähe Lucasfilm ansässig ist, und eine Andeutung auf die Verfahren, die mit optischen, bildgebenden Systemen verbunden sind (REYES wird gesprochen wie das englische Wort rays, was Lichtstrahlen oder in der Optik, als Singular ray, den Sehstrahl bezeichnet).
Die Architektur wurde unter Berücksichtigung einer Anzahl Bedingungen entworfen:
* Geometrische Komplexität / Vielfalt: Um visuell komplexe und reichhaltige Bilder zu erzeugen, muss der Anwender eines Bildsynthesesystems die Freiheit haben, eine große Anzahl an komplexen, geometrischen Strukturen zu modellieren oder durch prozedurale Modelle, wie zum Beispiel Fraktale oder Partikelsysteme, zu erzeugen.
* Komplexe Shader: Vieles von der visuellen Komplexität einer Szene wird erzeugt durch die Art, in der das Licht mit der Oberfläche fester Körper interagiert. Im Allgemeinen wird dies im Bereich der Computergrafik durch Texturen erreicht. Texturen können Tabellen farbiger Pixel sein, die Oberflächenverschiebungen (Displacement), Oberflächentransparenz oder Oberflächenreflektivität beschreiben. REYES erlaubt es dem Benutzer, prozedurale Shader einzubinden, wodurch Oberflächenstruktur und optische Interaktion (der Objekte in einer Szene) durch die Benutzung eines Computerprogramms erreicht wird, das prozedurale Algorithmen implementiert, anstatt in einer einfachen Tabelle (wie z. B. einer Textur) nachzuschlagen. Ein großer Teil dieses Algorithmus zielt darauf ab, die Zeit zu minimieren, die der Hauptprozessor dafür benötigt, Texturdaten aus Datenspeichern anzufordern.
* Minimales Raytracing: Als REYES entworfen wurde, war die Rechenleistung und Speicherkapazität der Computersysteme leistungsschwächer. Das bedeutete, dass das Raytracen einer fotorealistischen Szene pro Einzelbild dutzende bis hunderte von Stunden dauern konnte. Algorithmen wie REYES, die in der Regel kein Raytracing verwenden, laufen daher viel schneller und haben trotzdem ein annähernd fotorealistisches Ergebnis.
* Geschwindigkeit: Das Berechnen eines Zwei-Stunden-Films mit 24 Bildern pro Sekunde ist bei einer durchschnittlichen Berechnungszeit von drei Minuten pro Einzelbild innerhalb eines Jahres möglich.
* Bildqualität: Artefakte im Bild, hervorgerufen durch den verwendeten Bildsynthesealgorithmus, sind unakzeptabel.
* Flexibilität: Die Architektur sollte so flexibel sein, dass die Einbindung neuer Techniken ohne eine vollständige Neuimplementierung des Algorithmus möglich ist.
REYES erfüllt effizient mehrere Aufgaben für Effekte, die für die Berechnung in Kinofilmqualität nötig sind: Glatte, gekrümmte Flächen, Oberflächentexturierung, Bewegungsunschärfe und Tiefenunschärfe.
REYES berechnet gekrümmte Oberflächen, wie solche, die durch parametrische Teilflächen (parametrische Patches) beschrieben werden, dadurch, dass es die Teilflächen in Mikropolygone teilt; dies sind kleine Quadrate, von denen jedes kleiner ist als die Größe eines Pixels. Obwohl viele Mikropolygone nötig sind, um die Approximation einer gekrümmten Fläche akkurat durchzuführen, können sie mit einfachen, parallelisierbaren Operationen verarbeitet werden. Ein REYES-Renderer tessliert die Primitiven höherer Ordnung bei Bedarf und teilt jede Primitive nur so fein auf, dass es im finalen Bild akkurat aussieht.
Anschließend ordnet ein Shader jedem Mikropolygon Farbe und Transparenz zu. Die meisten REYES-Renderer erlauben es dem Benutzer, beliebige Beleuchtungs- und Texturierungs-Funktionen selbst hinzuzufügen, geschrieben in einer Shader-Sprache, die speziell für die Bedürfnisse der Verarbeitung von Daten aus der Bildsynthese geschaffen wird. Die Verarbeitung der Mikropolygone geschieht so, dass die Berechnung der Daten vektorisiert werden kann.
Geshadete Mikropolygone werden auf die Bildebene abgebildet, um das Ausgabebild zu erzeugen. REYES benutzt einen innovativen Algorithmus für das Sichtbarkeitsproblem, englisch hider genannt, der die nötige Integration von Bewegungs- und Tiefenunschärfe durchführt, ohne mehr Geometrie oder Shaderaufrufe zu benötigen als die Berechnung eines scharfen Bildes bräuchte. Der hider sammelt alle Farben der Mikropolygone in einem Pixel über die Zeit und Linsenposition durch einen Monte-Carlo-Algorithmus, der Stochastic Sampling genannt wird.
Die grundlegende REYES-Grafikpipeline basiert auf folgenden Schritten:
* Bound: Berechnung des Bounding Volumes jeder einzelnen geometrischen Primitive.
* Split: Zerteile große Primitive in kleinere, die man in Mikropolygone zerlegen kann.
* Dice: Wandel die Primitiven in ein Raster aus Mikropolygonen um, jedes Mikropolygon mit der ungefähren Größe eines Pixels.
* Shade: Berechne die Beleuchtung und die Schattierung und jedes Vertex des Mikropolygonrasters.
* Bust: Zerlege das Mikropolygonraster in einzelne Mikropolygone, berechne für jedes ein Bounding Volume und prüfe, ob es nicht durch andere Mikropolygone verdeckt wird (vom Prinzip ausgehend eine Miniaturversion der Grafikpipeline).
* Hide: Taste die Mikropolygone ab und erstelle das letztendliche 2D-Bild.
Bei diesem Design muss der Renderer den kompletten Bildspeicher im Hauptspeicher bereitstellen, da das endgültige Bild so lange nicht ausgegeben werden kann, bis alle Primitiven verarbeitet wurden. Zur Speicheroptimierung wird vor dem Dice-Schritt ein weiterer Schritt, genannt Bucketing, eingefügt. Das Ausgabebild wird hierzu in ein Raster aus einzelnen Rechtecken eingeteilt, genannt Bucket (englisch für Eimer), jedes typischerweise 16 ×16 Pixel groß. Die Objekte werden dann grob entlang der Grenzen der Buckets geteilt und dann nach ihrem Ort dem jeweiligen Bucket zugeordnet. Jeder Bucket durchläuft einzeln für sich den Dice und die restlichen Schritte der Grafikpipeline, und Daten vom vorhergehenden Bucket, die nicht mehr gebraucht werden, werden verworfen, bevor der Nächste berechnet wird. Auf diese Weise muss nur der Bildspeicher für den in Bearbeitung befindlichen Bucket und Speicher für die Szenenbeschreibung höherer Ordnung für alle geometrischen Primitiven bereitgestellt werden. Dies führt zu einer erheblichen Senkung des Speicherverbrauches für eine durchschnittliche Szene, verglichen mit dem nicht veränderten REYES-Algorithmus.

## REYES-Renderer

Die folgenden Renderer verwenden den REYES-Algorithmus auf die eine oder andere Weise, oder erlauben dem Benutzer zumindest, ihn als Vorgabe zu verwenden:
* 3Delight
* Aqsis
* jrMan
* RenderMan Pro Server & RenderMan for Maya
* Pixels 3d Renderer
* Pixie
* RenderDotC
* Mantra
* Poser FireFly