Mein Real-Time Raytracer

vadersfather

loyale Senatswache
Da das Programmierforum in dem ich so tätig bin keine Dateianhängfunktion hat, hab ich mich mal entschlossen ihn euch zu präsentieren. :)
Es ist soweit. Mein Echtzeit-Raytracer geht in eine Präsentationsfähige Phase. Er ist in C++ geschreiben und baut auf der SDL auf. Aber alles was mit SDL zutun hat ist in eine "CFramework" Funktion gekapselt, (mit Init, PutPixel etc), sodass es sich leicht mir DDraw oder so auswechseln lässt. Zur Zeit ist der Raytracer noch ätzend lahm, aber heute habe ich eine entscheidende, Bildqualitätsmindernde optimierung, zugunsten der FPS vorgenommen. Eine Technik, die es warscheinlich bereits schon gibt, die ich aber neu erfunden habe, nams: Motion detecting!!!! ;) Das Bild sieht nicht zufällig bei schnellerer Bewegung wie ein MPEG video aus.... Die Logik: Es kann ein MD-Faktor bestimmt werden. Bei zb. 4 wird das bild in quadrate mit 4*4 Pixeln aufgeteilt. An jeder Kante wird ein Ray abgefeuert. Und wenn die mit dem vorgängerbild übereinstimmen, werden sie übernommen. Das bringt bis zu 10frames mehr. Natürlich erkennt man an feinen Abstufunen (man kann festlegen wieviel % der Farbe nicht übereinstimmen darf) dass da so Fehler aufkreuzen. Vor allem wenn man die Quadratgröße auf 32 erhöht ^^
Der Raytracer kann schon: Kugeln und Ebenen, Spiegelungen und Lichter, alles in vielen schönen Farben!!!
Als Anhang ein supadupa screenshot... :cool:
 

Anhänge

  • Bild3.jpg
    Bild3.jpg
    19,8 KB · Aufrufe: 74
Hey, cool!
Machst du mal auch so ne Demo zum spielen, oder so?
Wieviel FPS hast du bei welcher Auflösung?
Habe selbst vor, mal ne Echtzeit-Raytracing-Engine zu machen...doch zuerst muss ich andere Projekte fertig bringen.

Wie machst du den das mit dem Strahl? Du lässt also von jedem Pixel, (oder wie bei dir von einer Kante einer Quadrates) einen Strahl, also mathematisch gesehen eine Gerade laufen. Wie funktioniert dann die Kollisionsabfrage mit den Objekten im Raum?

Bin mir sehr sicher, dass Raytracing (bzw. Radiosity) die Zukunft der 3D-Spiele sein wird!
 
Bei 360*360 Pixel gibts so um die 10 Frames. Bei Bewegung natürlich. Wenn man das Bild still stehen lässt, ohne sich/eine Kugel/ein Licht zu bewegen, dann schiessts hoch auf 70 ;) . Ne Demo ... Naja ich hab zurzeit kein Webspace! Und Spielen... hehe da kannst du um ein paar Kugeln rumtuckern *g* das ist nicht wirklich spielen.
Zur Mathematik: Es wird erst ermittelt, welche Kugel dem Strahl am nähesten liegt. Kugeln sind perfekte runde Objekte, also lässt sich da mit dem Radius leicht was zusammenfaken. Die Details und das Pong lighting system ist sehr kompliziert, aber da gibts genug docs im internet.
Radiosity und Raytracing sind eigetnlich 2 verschiedene Sachen. Es ist auch sehr aufwändig Radiosity in Raytracing zu imlementieren! Falls dus verwechselst: Radiosity ist indirekte beleuchtung, flächen reflektieren ein wenig licht in ihrer farbe.
Wenn du eine (tech)Demo haben willst, email adresse her.... Den Quellcode gibts auch bald auf der dazugehörigen Webseite, oder auf der meines vorheringen Projektes, Helix. Ein fettes Betriebssystem :p www.helixos.de.vu .

Geh mal auf www.Realstorm.com und lad dir den neusten Benchmark runter. Die leute haben keine ASM oder simd optimierungen vorgenommen. Das ist echt DER wahnsinn....
 
Zurück
Oben