My little Raytracer - ORCA



  • Hi,
    Hier wird jetzt mein erstes richtig großes Projekt(von ein paar kleinen Spielen mal abgesehen) in der Richtung CG Presentiert. Ein Raytracer, speziell ausgelegt auf die Möglichkeit, damit zu experementieren und ihn Problemlos zu erweitern. Das ganze wird möglich durch abstrakte Basisklassen für Objekte Materialien etc.
    Die subklassen dieser Objekte komunizieren dann über Festgelegte Schnittstellenklassen. Sauber, Einfach, Langsam...
    Der Name steht für OpenRaytraceC++Api
    soll halt, wenn es mal in nem aktzeptablen zustand und gut dokumentiert ist Opensource werden.
    Das Framework steht bis auf eine Kleine änderung die noch gemacht wird(Teilung in Material& Map Klasse wo jetzt nur die MaterialKlasse existiert) und ich habe gestern angefangen ernsthafte subklassen zu bauen.

    Bisher implementiert:
    Natürlich alle Basisklassen,
    Reflectionsmaterial,
    Diffuses Reflectionsmaterial,
    Phong einfarbiges Material(Farbe einstellbar) mit Schatten,
    Schachbrettmaterial(natürlich auch Phong),
    TestObjekt(Pyramide+Sphere),
    PolygonObjekt mit Fileloader,
    PolygonObjekt mit Fileloader und AABB für Optimierung
    Unoptimierte Renderdevice für beliebig viel Objekt, Lichter und Materialien,
    AntiAliasing 1, 5, 3x3.
    Farbiges Punktlicht.
    (hier werden bald neue dinge folgen^^)

    und zwei hübsch bildchen:
    http://i14.photobucket.com/albums/a322/TheGameMaker/test6.jpg
    (Die Polyfheler rühren nicht von einem Fehler im Renderer sondern von meinm unvermögen ein 176 Polyobjekt per hand in mein eigendes Format zu verwandeln^^)
    http://i14.photobucket.com/albums/a322/TheGameMaker/test7.jpg
    und weils so schön war gleich noch ein weiteres Bild^^

    Greeting tgm



  • 🙂 👍



  • ok.. update...
    Mehrfachspiegelungen!
    http://i14.photobucket.com/albums/a322/TheGameMaker/MultiReflaction.jpg
    greetz TGM



  • na, das sieht doch schon wirklich nach was aus! 👍
    aber irgendwie hält sich die bevölkerung hier mit dem applaus zurück... 😕 seltsam... 🤡
    wie auch immer: ich finds cool! will auch irgendwann mal sowas proggen, allerdings wohl nicht zu allgemein und nicht dokumentiert, sondern einfach so... für sich 🙂



  • nice!

    ich hab vor langer zeit auch mal ein bisschen mit raytracing gespielt:

    http://www.m4studios.at/dot/rt1.jpg

    vor nicht allzu langer zeit hab ich dann ein raytrace plugin für milkshape geschrieben...leider isses immer noch bei weitem nicht fertig:

    http://www.m4studios.at/dot/ray1.jpg

    irgendwie komm ich nie dazu 🤡



  • hm, sieht ja schon ganz nett aus. wie siehts mit der performance aus? auf welchem rechner testest du das ganze?



  • Respekt! 👍 Endlich mal nicht ein 3D-Engine-Projekt! Finde ich sehr cool!



  • hm, wäre ORCA in der lage wirklich sehr viele mehrfachreflexionen zu rendern? Mir ist nähmlich eben eine idee in den sinn gekommen, so ein kleines experiment, hab ich mal irgendwo im www gesehen:

    ( ⚠ technische details, kann man überspringen ⚠ )
    Man stelle sich einen tetraeder mit kantenlänge a vor.
    Die ecken des tetraeders nehme man als mittelpunkte für vier kugel mit dem radius a/2, deren oberfläche das licht (fast) ideal reflektiert.
    In der Mitte des tetraeders bleibt ein hohlraum übrig, durch vier lücken zwischen den kugeln kann man da reinsehen.
    Nun werden drei lücken mit farbigen folien (zB rot, lila, gelb) abgedeckt, sodass von aussen immer noch licht eindringen kann (muss man bei ORCA jetzt wohl mit drei recht weit entfernten punktlichtquellen ersetzen, falls es noch kein paralleles licht gibt)
    Vor die vierte lücke plaziert man eine kamera, und schaut sich die reflexionen im inneren des tetraeders an.
    ( ⚠ )

    Wenn es gut klappt, muss eigentlich etwas recht beeindrückendes rauskommen.
    Falls du lust/zeit hast, um das mit deinem raytracer auszuprobieren: hier der versuchsaufbau: 😃

    4 schwarze, 95% ideal spiegelnde kugeln mit r=0.5 und mittelpunkten abcd:
    
    A(0.5773 | 0 | 0)
    B(-0.2886 | 0.5 | 0 )
    C(-0.2886 | -0.5 | 0)
    D(0 | 0 | 0.8165 )
    
    drei farbige punktlichter:
    L1 (0.865 | 1.497 | 1.122)
    L2 (-1.729 | 0 | 1.122)
    L3 (0.865 | -1.497 | 1.122)
    
    und die kamera:
    Position (0 | 0 | -1) Richtung (0 | 0 | 1) nachObenVector (1 | 0 | 0 )
    

    Für dieses experiment sollte man aber möglichst viele mehrfachreflexionen machen, vieviele: hängt davon ab, wie schnell dein raytracer ist 🙂

    naja, nur mal so ein vorschlag, solltest du dich irgendwann mal langweilen, kannst es mal ausprobieren 🤡

    edit: schade, dass es noch kein paralleles licht gibt. Damit es klappt, muss man die punktlichtquellen evtl durch 3 weitere große farbige kugel ersetzen, und dann mit weißer ambient-farbe "zum leuchten bringen"



  • Danke für all die antworten..
    @dot: jo.. das isset doch schonmal was^^ Texturen hab ich leider noch nicht drinnen..
    @Andrey&Artchi: thx!
    @TravisG: das willst du garnicht wissen^^ das teil ist noch in keinster weise Optimiert(octree kommt heute/morgen/übermorgen) und wegen der hohen anpassungsfähigkeit(alles voll virtueler funktionen etc) auch nicht wirklich auf tempo, sondern auf gute Programmierbarkeit ausgelegt. Mein System ist ein
    intel 3ghz, 1 gb ram
    @Andrey die zweite 😉 :
    klingt lustig.... aber der ist leider noch relativ langsam und irgentwann wird der Rekursionsstack natürlich auch irgentwann zu groß aber 40-50 spiegelungen sollten drinnen sein. Richtungslicher sind nen feature das in planung ist(mit anderen Lichttypen: arena-,ambient- und spotlights). Aber Ein wenig Optimierung hat vorrang^^ nicht viel aber naja. Obwohl sich bei 3 Kugeln natürlich nicht so viel optimieren lässt.. 😉 😉
    jedenfalls werde ich dein Experiement mal in Max ausprobieren...

    Updates kommen später, bin heute leider nicht zuhause..
    greetz tgm



  • Kannst du die Resultate von dem Experiment dann hier posten?



  • Aua... thats impressiv^^ lade es hier gleich hoch.... sieht ziemlich böse aus^^
    in 2048*1536 und mit ner strahlentiefe von 50^^
    http://img409.imageshack.us/my.php?image=test2kh6.jpg
    und noch eins mit kleinernen Leuchtobjekten:
    http://img339.imageshack.us/img339/9861/testvr7.jpg



  • hab die dinger mal mit meinem box-counting programmchen mal auswerten lassen, beim ersten kommt 1.61 bei zweiten 1.37 als fraktale dimension raus, voll lustig 🙂



  • Ui, Hut ab! Ich hatte mich mal vor kurzem schnell bei OpenRT eingelesen. OpenRT verwendet für die Materialien Shader und du anscheinend Materialklassen.
    Lässt sich über so einen Shader/Materialklasse wirklich jedes Material darstellen unabhängig von anderen Shader/Materialklassen?

    Könnte man so einen Raytracer vllt. in 2 Teile unterteilen?:
    - Formeln zum ermitteln der Schnittpunkte zwischen ausgestrahlten Strahl und der Geometrie
    - Wenn ein Strahl auf einen Körper trifft, wird der Strahl mittels Shader verändert? Sprich seine Farbe bestimmt, seine Richtung etc.

    Wäre nett, wenn du etwas mehr über die Technik in deinem Raytracer berichtest ^^

    mfg olli



  • Also: es gibt eine welt-klasse, die enthalt ein vector(Dynamisches Array) von:
    1)Allen Objekten
    2)Allen Materialien
    3)Allen Lichtern
    4)Einer Kamera
    Diese Weltklasse stellt eine funktion berreit, die den schnitt mit einem Strahl zurückliefert. Es wird dabei eine klasse "intersection" zurückgegeben, die neben Position, Normale, Objekt etc. auch noch frei belegbare werte enthält für z.B. Texturcoordinaten etc..
    Diese Klasse wird dann an das Material Weitergegeben, das völlig eigenständig ohne irgentwei von dem Objekt abhängig zu sein, die Farbe für den Entsprechenden Pixel zurückliefert.
    Ein Material setzt sich aus verschiedenden "Maps" zusammen, sodas z.B. der Code für diffuse beleuchtung oder Für die Reflection eine Map bilden, und dann vom Material kombiniert werden können.
    (Maps bekommen ebenfalls die "intersection Klasse übergeben). Dadurch lassen sich dann z.B. MAterialklassen schreiben, die Pointer auf verschiede Maps hatt, und die auf Festgelegte weise kombiniert... daher ein MAterial das Diffus, Specular Power, Shinines, Bump, Ocopacity etc von Maps geliefert bekommt.
    Damit lässt sich dann ein Material-File-format bauen..
    Die möglichkeiten sind so ziemlich unbegrenzt..
    Ich z.B. habe bis jetzt die besagten maps für Reflection, Beleuchtung und eine Schachbretttextur erstellt, viele weiter folgen noch. z.B. für Texturen, fallofs etc.. Viel arbeit übrig^^
    Wenn du irgentwelche speziellen Ideen hast, frag ruhig... eventuell is ja sogar was lustiges dabei^^

    @Andrey: blub?? bitte WAS?? hab nicht ein wort verstanden...(wenn du daruaf aus willst, die Beiden Bilder sind mit unterschiedlicher Reflectionstiefe Gerender, 50/10) aber erklär mal, was du meinst.. 😮 😮

    greetings..



  • Danke ^^
    Es wird ja mehrere Schnittpunkte geben pro Strahl. Da muss er wohl den Nehmen, der die geringste Differenz zum Ursprungspunkt des Strahls hat?

    Jetzt trifft ein Strahl auf eine Fläche... Erhält der Shader jetzt auch Informationen über die Normale der Oberfläche und auch Informationen über den Strahl selber? Wenn ja, könnte man ja beispielsweise ein Refraktionsmaterial erstellen(um Glas/Wasser zu simulieren).

    Wie funktionieren die Lichtberechnungen im Raytracer? Senden die Lichtquellen selber Strahlen aus? Wenn ja, ließen sich da Caustics simulieren?

    Wie wird eigentlich beispielsweise FOV der Kamera berechnet? Wenn die Strahlen vom "Bildschirm" aus parallel in die Szene ausgesendet werden, ist das deine eine orthogonale Perspektive?

    Sorry fürs Löschern mit den Fragen, aber das interessiert mich ungemein ^^

    mfg olli



  • blub?? bitte WAS??

    ach vergiss es, ist unwichtig 🤡 , hat an sich recht wenig mit dem thema "raytracing" zu tun. Dieses experiment kenne ich, weil ich mich mal mit verschiedenen gebrochen-dimensionalen strukturen auseinandergesetzt habe (grundlagen sind an sich nicht sonderlich komliziert, aber das alles sieht einfach voll abgefahren aus).
    ich wollte einfach mal wissen, ob sich ein solches experiment mit einem raytracer gut simulieren lässt. Mich hat einfach voll umgehauen, dass man mit primitivsten geometrischen objekten [einfachen kugeln, was einfacheres gibt es eigentlich nicht 😮 ] solche seltsamen muster erzeugen kann. danke 🙂 👍



  • @Andrey: hmm.. klingt irgentwie nach Fraktalen.. aber keine ahnung^^ mal merken und nach "gebrochen-dimensionalen strukturen" googeln.. eventuel ist das ja lustig^^
    @Vertex zu allererst Fragen sind wichtig, sonnst lernt man ja nichts^^

    Es wird ja mehrere Schnittpunkte geben pro Strahl. Da muss er wohl den Nehmen, der die geringste Differenz zum Ursprungspunkt des Strahls hat?

    jo.. stimmt wohl, obwohl man hier noch optimieren könnte, das er eine liste aller schnittpunkte zurückgibt.. gute sache, da wäre ich so nie drauf gekommen^^

    Jetzt trifft ein Strahl auf eine Fläche... Erhält der Shader jetzt auchInformationen über die Normale der Oberfläche und auch Informationen über den Strahl selber? Wenn ja, könnte man ja beispielsweise ein Refraktionsmaterial erstellen(um Glas/Wasser zu simulieren).

    Natürlich. Der Shader ist auch in der Lage selber wieder Strahlen auszuschicken etc.

    Wie funktionieren die Lichtberechnungen im Raytracer? Senden die Lichtquellen selber Strahlen aus? Wenn ja, ließen sich da Caustics simulieren?

    also.. ich trace durch einen pixel, und finde den dahinterleigenden Punkt. Von diesem Punkt aus trace ich zu allen Lichtern, um zu prüfen ob diese hier hinscheinen, oder der punkt im schatten liegt. Damit sind Caustics/GI leider unmöglich. Aber hier hilft photon mapping, bei den erst eine sammlung "photonen"
    uber die szene verteilt werden, und die Helligkeit dann mit den naheliegenden photonen berrechnet wird. (man kommt so mit weniger photonen aus, als bei echter GI).

    Wie wird eigentlich beispielsweise FOV der Kamera berechnet? Wenn die Strahlen vom "Bildschirm" aus parallel in die Szene ausgesendet werden, ist das deine eine orthogonale Perspektive?

    stell dir vor, ich denke mir eine ebende im Raum. Diese Ebende Representiert das Fertige Bild. (daher: die Ebende ist nicht unendlich, sondern begrenzt auf eine bestimmte größe.) nun hat jeder Pixel im bild einen Punkt auf der Ebende.
    ausserdem Definieren wir einen Augenpunkt. für jeden Pixel schicke ich nun einen Strahl vom Augenpunkt dürch die Stelle auf der Ebende, und gucke was dahinter liegt. Wenn man den Augenpunkt wegläst, und einfach immer entlang der Normalen traced hat man eine Orthografische Projektion...

    (als tipp zum further reading:http://www.devmaster.net/articles.php)
    hier findet sich unter anderem eine hervoragende serie zum thema wie man einen Raytracer baut;) wirklich gut die seite..
    greetz TGM

    *edit* wer sich das mal ein wenig angucken will findet hier den source mit einer Readme drinnen, die ein paar Erklärungen beinhaltet..
    (aber leider noch recht... unausgereift^^)



  • eventuel ist das ja lustig^^

    ja, durchaus "lustig" , ich hab mir damals diese ganzen fraktale wochenlang angesehen, bis ich dann irgendwann beim anblick einer einfachen weißgestrichenen wand fast erbrechen musste 😃 mit LSD wäre das wahrscheinlich noch cooler geworden 🤡 jez abr schluss, zurück zum thema:

    Damit sind Caustics/GI leider unmöglich. Aber hier hilft photon mapping, bei den erst eine sammlung "photonen"
    uber die szene verteilt werden

    Ich hätte da mal eine frage: afaik werden beim photon-mapping die photonen von den lichtquellen aus gesandt. Ist das nicht so, dass da die meisten photonen irgendwo landen, wo sie vom betrachter aus nicht zu sehen sind? Ist das nicht furchtbar verschwenderisch, wenn man nur ein bild aus einer blickrichtung zeichnen will?



  • Andrey schrieb:

    Damit sind Caustics/GI leider unmöglich. Aber hier hilft photon mapping, bei den erst eine sammlung "photonen"
    uber die szene verteilt werden

    Ich hätte da mal eine frage: afaik werden beim photon-mapping die photonen von den lichtquellen aus gesandt. Ist das nicht so, dass da die meisten photonen irgendwo landen, wo sie vom betrachter aus nicht zu sehen sind? Ist das nicht furchtbar verschwenderisch, wenn man nur ein bild aus einer blickrichtung zeichnen will?

    richtig. für einzelne bilder ist photonmapping leicht overkill. genauso bei beweglichen lichtern in einem echtzeit renderer. Anders sind kaustiken aber leider auch nicht so ohne weiteres zu berechnen(die alternative wäre, n strahlen von jedem zu zeichnenden punkt aus in alle richtungen zu verschicken, dann über reflektionen/brechungen bis zu einer bestimmten tiefe/intensität wandern zu lassen und schauen, ob sie irgendwo direkt auf eine lichtquelle treffen).



  • ist das nicht das prinzip von "path tracing" oder vertausche ich da irgendwas?


Anmelden zum Antworten