My little Raytracer - ORCA



  • 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?



  • genau^^ das ist pathtracing variante 1^^

    variante 2 schießt wirklich von jedem licht Strahlen ab und guckt wo sie auftreffen& weiterreflektiert werden..

    hab auch mal nen bissle fraktal rumgespielt:
    http://www.3d-ring.de/3d_bilder.php?bild_autor=4298&bild_id=26

    greetz



  • TGM schrieb:

    hab auch mal nen bissle fraktal rumgespielt:
    http://www.3d-ring.de/3d_bilder.php?bild_autor=4298&bild_id=26

    Interessant, dass ich genau das selbe Bild damals hatte, als ich Mandelbrot visualisieren wollte 😛 Weiß aber grad nicht mehr, was der Fehler war..
    http://bloody-blades.de/?page_id=21



  • also, ich muss protestieren!! 😃
    mit der konvergenz gegen 0 hat das alles recht wenig zu tun, bzw. es gibt bei der mandelbrotmenge nur einen einzigen superfixpunkt, dessen orbit jemals den wert 0+0i annimmt: die null selbst.
    Es muss vielmehr heissen: alles, was nicht in die unendlichkeit divergiert, gehört zur mandelbrotmenge.

    zum fehler: bist du dir sicher, dass du die komplexen zahlen richtig potenzierst? Die bestehen aus zwei komponenten, du musst eine immer zwischenspeichern. Auf dem bild sieht es so aus, als ob du sowas in schleife machen würdest:

    z_re=(z_re*z_re-z_im*z_im) +c_re;
    z_im=(2*z_re*z_im) +c_im;
    

    bin mir fast 99.8% sicher, dass ich den fehler auch zwischendurch hatte 😃
    es soll aber so aussehen:

    NEW_z_re=(z_re*z_re-z_im*z_im) +c_re;
    z_im=(2*z_re*z_im) +c_im;
    z_re=NEW_z_re;
    

    weil man ansonsten mit bereits veränderten werten weiterrechnet 🤡 👍



  • so, hab heute nochmal nen ganz bissle gebastelt.
    http://i14.photobucket.com/albums/a322/TheGameMaker/reflactpolyobj.jpg
    http://i14.photobucket.com/albums/a322/TheGameMaker/specular.png
    (speculare Materialeigenschaften).. das Bild vorher zeigt einfach nochmal das feature für Poly objekte und Spiegelungen 😉
    greetz TGM

    verät mir mal jemand, wie ich hier Bilder verlinke??



  • Hier ist schon so viel Lob gekommen... da muss ich mich einfach anschließen: Ich bin schwer beeindruckt! 👍 🙂 Ich hoffe, Du machst noch ein ganzes Stück weiter mit diesem Projekt.


Anmelden zum Antworten