YART - Yet another Raytracer
-
Hallo,
da ich im Moment ein Proseminar über das Thema schreibe, habe ich meinen eigenen kleinen Raytracer geschrieben. Wirklich viele Features gibt es im Moment noch nicht, aber es lassen sich schon relativ nette Bilder erzeugen, zum Beispiel so wie hier klick.
Die Benutzung ist relativ einfach... Wenn man den Sourcecode kompilert hat, kann man das Programm entweder mit Kommandozeilenargumenten starten, also zum Beispiel über
./RayTracer.exe -s ../src/MyScene3.txt -i TestBild.bmp
wenn man die Szene ../src/MyScene3.txt in die Datei TestBild.bmp rendern will... Oder man startet einfach mit ./RayTracer.exe und gibt dann wenn man dazu aufgefordert wird die beiden Pfade ein.
Es wird als Ausgabeformat nur Bitmap unterstützt (ist schön einfach ).
Das Format für die Szenen sieht so aus:
General-Settings Background-Color: FFFFFF EyePoint: 200 200 -200 LeftBottomEdge: 0 0 0 X-Direction: 0.3 0 0 Y-Direction: 0 0.3 0 X-Pixels: 1000 Y-Pixels: 1000 Gridsize: 20 GridStart: -300 -300 -300 GridEnd: 500 500 350 Light Sources Light FFFFFF 300 300 170 Primitives #Primitive-Type Color Diffuse Reflection Specular Transmission RefractionIndex TypeSpecific (position) Sphere FFFFFF 0.0 0.0 0.7 1 1.1 250 250 50 100
Dabei können unter Light Sources und Primitives beliebig viele Lichtquellen/Primitiven kommen. Die Background-Color wird im Moment einfach ignoriert, vielleicht wird sich das aber später noch ändern. Der Eye-Point ist der Punkt, von dem aus alle Strahlen gesendet werden. LeftBottomEdge ist die untere linke Ecke der Bildebene und X-Direction und Y-Direction sind die beiden Richtungsvektoren der Bildebene (sollten nach Möglichkeit senkrecht zueinander stehen ) X-Pixels und Y-Pixels geben die Auflösung des Bildes an und Grid-Start und Grid-End sind die linke untere Ecke und die rechte obere Ecke der Bounding Box für die Szene.
Bei den Lichtquellen muss nur die Lichtfarbe und die Position angegeben werden, bei den Primitiven gibt es im Moment nur Kugeln (Sphere) und Ebenen (Plane). Die Oberflächeneigenschaften sind für alle Primitiven identisch. Die Koeffizienten sollten alle zwischen 0.0 und 1.0 liegen. Diffuse gibt an, wie stark die Oberfläche sichtbar ist, d.h. (zusammen mit Transmission) wie opak die Oberfläche ist. Reflection gibt an, wie stark die Oberfläche reflektiert und Specular ist für die stärke der "Glanzpunkte". Der RefractionIndex gibt den Brechungsindex an.
Danach kommt bei einer Kugel der Mittelpunkt und der Radius, bei einer Ebene der Normalenvektor und der Abstand vom Ursprung.
Eine Besonderheit ist, dass man die Methode für die Schnittbestimmung über einen Template-Parameter relativ leicht austauschen kann, im Moment sind die naive Methode, ein einfaches Gitter und ein BSP-Baum implementiert:
int main(int argc, char const *argv[]) { if(getopt(argc, argv, "-h") != -1) { cout << "Yet Another Raytracer" << endl; cout << "Usage" << endl << endl; cout << "-s: path of the scene to be rendered" << endl; cout << "-i: path of the rendered image (output is written in bitmap format)" << endl; cout << "Alternative input of pathes via command-line if not arguments are present" << endl; return 0; } int index = 0; string scenePath; if((index = getopt(argc, argv, "-s")) == -1) { cout << "Please insert the scene-path" << endl; cin >> scenePath; } else { scenePath = argv[index]; } RayTracer<BSPTree> theTracer(scenePath); //Es gibt auch RayTracer<NaiveIntersection> und RayTracer<RegularGrid> string imagePath; if((index = getopt(argc, argv, "-i")) == -1) { cout << "Please insert the path for the rendered image" << endl; cin >> imagePath; } else { imagePath = argv[index]; } theTracer.CalculatePicture(imagePath); return 0; }
Den Code gibt es hier
Felix
Würde mich über Kommentar jeglicher Art (zum Code, oder was auch immer) freuen!
-
interessant. zieh ich mir gleich mal morgen früh bei 'nem kaffee rein
-
--- a/src Kopie/BoundingBox.h 2008-05-02 19:11:06.000000000 +0200 +++ b/src Kopie/BoundingBox.h 2008-05-16 07:24:37.000000000 +0200 @@ -1,6 +1,7 @@ #ifndef INCLUDED_BOUNDING_BOX_H #define INCLUDED_BOUNDING_BOX_H +#include <limits> #include "Vector.h" #include "Ray.h" #include "Primitive.h"
to make it comile mit gcc 4.3
gefällt mir gut! wenn ich zeit habe, forste ich den code noch mal genauer durchedit:
ok, wer ist simone? lol.
btw, gerendert auf linux x86_64: