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 durch 🙂

    edit:

    ok, wer ist simone? lol. 😃

    btw, gerendert auf linux x86_64:

    test1
    test2

    👍


Anmelden zum Antworten