So nach einem eher anstrengenden Semester hab ich beschlossen an APE weiter zu arbeiten. Ich hoffe, dass ich vielleiicht ein paar Leute für das Projekt begeistern kann, Ziel ist nach wie vor echtzeit RT:D
Also erstmal ein paar Bilder:
ape-box.png
Die alte Box Demo mit 1280x1024 Bildpunkten, zur geändeten Technik sag ich gleich was.
ape-world.png
Die alte demo mit Texturen, Normalmaps etc.
Die Bilder sind beide auf einem Core i7 920 mit 6Gb Ram entstanden, wobei der Speicherverbrauch von box mit 120MB wesentlich unter dem der Version 0.2 liegt.
Das HT liefert 30 - 50% mehr rays/sec (RPS).
Das mit dem Echtzeit erreichen wir aber trotzdem noch nicht wirklich, da wir auf vollständiges asynchrones raytracing umgestiegen sind, d.h. es wird ein update des screenbuffers gemacht, egal wie viele pixel gerade aktualisiert wurden. Das führt zu den "Schlieren" im oberen Bild. Würde man auf synchrones oder quasisynchrones updaten umsteigen, dann hätte man keinen wesentlichen speedzuwachs gegenüber version 0.2 (was bei drei Tagen arbeit auch nicht verwunderlich ist;) ).
Sehr interessant ist allerdings, dass es keinerlei (kernel-)synchronisations Primitive mehr gibt, was dazu führt, dass alle physischen Rechenkerne zu 100% ausgelastet sind. Je nach Demo sind bei mir sogar alle 8 CPUs bei 100% Auslastung. Außerdem ist es mit diesem Ansatz theoretisch möglich ohne großen Aufwand zusätzlich OpenCL/CUDA/... -Threads zum Rechnen dazuzunehmen. Also falls jemand Lust hat OpenCL zu lernen und noch nicht weis, was er machen will, ich hätt da n paar Tipps und würd gerne helfen;)
Der code ist zu 0.2 noch relativ kompatibel, da sich aber der Aufbau der RenderThreads geändert hat, werden sich da zwangsläufig Inkompatibilitäten ergeben. Momentan hab ich ziemlich viele Sachen rausgeworfen, die im weg waren, wie Auxbuffer, *PutFunctions, alte Cameras/RayCasterFunctions.
Wegen der fehlenden AuxBuffer sieht das *blur* auch etwas merkwürdig aus. Man kann halt leider atm keine Farben schön mischen, das steht aber ganz oben auf meiner Liste...direkt neben einer sinnvollen Implementierung für Szenemanagement, damit ich nicht mehr 30Mio mal pro sekunde std::vector brauch:-/
Kommentare willkommen:)
EDIT: Noch zu den RPS: von "echtzeit" kann man in etwa reden, wenn RPS/#Pixel > 30 ist, also wenn im Mittel jeder Pixel 30 mal pro Frame getroffen wird, davon trennt mich atm etwa ein Faktor 6 für die Demos und vermutich ein Faktor 10 für realistischere Szenen, wenn man alle einfachen Optimierungen vorgenommen hat und das Scenemanagement so funktioniert, wie's momentan aufm Papier und in meinem Kopf existiert:)
In den RPS sind btw. Sekundärstrahlen komplett drin, das beläuft sich atm auf 2-8 Strahlen.
Edit 2: Hab die AuxBuffer schnell wieder rein gemacht und die boxdemo dazu überredet volles AA zu zeigen(einfach die Kamera anhalten, keine alten Punkte entfernen und 10s warten):
ape-AAtrick.png
Und so sieht die Texturdemo aus, wenn man zu wenig Punkte entfernt:
ape-blur.png
Gruß
Lord D