Seite 1 von 5

[Projekt] GPU Pathtracer

Verfasst: 25.06.2010, 11:49
von Zudomon
Hi,

ich wollte euch meinen GPU Pathtracer vorstellen.

Das ganze ist aber leider nur Fladshading und die Szene ist auf ein 151 Dreiecks Stanfordbunny begrenzt. ;)
Außerdem fehlen da Optimierungen. ( Octree usw. )

Das ganze benötigt PixelShader 3.0

Für ein rauschfreies Bild braucht es etwa eine Minute... aktzeptable Ergebnisse hat man aber schon nach wenigen Sekunden. Es wird adaptiv gerendert. :D
test004096.jpg
Hier noch das Programm zum selber testen... die Steuerung ist etwas hackelig... bestimmt weil das GPU limitiert sein dürfte... krass ist, dass der pro Pixel mit 153 Dreiecke einen Schnitttest durchführt.
Zum bewegen WASD wie gewohnt, mit Rechtsklick kann man die Kamerablickrichtung bewegen... alles nur provisorisch...
PathTracer.zip
(282.21 KiB) 502-mal heruntergeladen
Gruß
Zudo

Re: [Projekt] GPU Pathtracer

Verfasst: 25.06.2010, 13:31
von Lord Delvin
Da kanns einer einfach nicht lassen:D
Sehr nett.

EDIT: wie schwer wärs die Dreiecke durch splines zu ersetzen?

Re: [Projekt] GPU Pathtracer

Verfasst: 25.06.2010, 13:36
von Schrompf
Der Hase hatte auf meinem Arbeitsrechner (NVidia Quadro NVS290) ein komplett schwarzes Dreieck links unten am Fuß. Hat ansonsten aber aus dem Stand funktioniert und irgendwie find ich das Prinzip faszinierend :-) Gute Arbeit!

Re: [Projekt] GPU Pathtracer

Verfasst: 25.06.2010, 13:47
von kimmi
Man sollte vorsichtig sein, wenn die GPU keine Pixelshader 3.0 unterstützt. Mich hat es die komplette Kiste im Büro abrauchen lassen. Ist alles praktisch eingefroren gewesen. nur ein Neustart hat geholfen. Aber die Bilder lassen schickes erahnen :).

Gruß Kimmi

Re: [Projekt] GPU Pathtracer

Verfasst: 25.06.2010, 13:48
von Zudomon
Lord Delvin hat geschrieben:Da kanns einer einfach nicht lassen:D
Sehr nett.
Schrompf hat geschrieben:Hat ansonsten aber aus dem Stand funktioniert und irgendwie find ich das Prinzip faszinierend Gute Arbeit!
Danke :D

Ich habe bisher immer gedacht, dass Raytracing nicht wirklich so eine große Zukunft hat. Aber bei dem Pathtracing bin ich mir nicht mehr so sicher. Weil wenn das einigermaßen in Echtzeit läuft, dann ist das schon wesentlich besser als normales Rasterizieren. Das Prinzip ist extrem einfach, nicht zu vergleichen mit Shadowmaptricksereien oder so. Man bekommt so ziemlich alle Effekte umsonst: Global Illumination, Lightbleeding, sogar Caustics. Und wenn man bedenkt, wie langsam eine gerenderte Szene wird, wenn man einfach mal ein paar 1024² Shadowmaps generiert und bei jedem Frame aktualisiert.
Schrompf hat geschrieben:Der Hase hatte auf meinem Arbeitsrechner (NVidia Quadro NVS290) ein komplett schwarzes Dreieck links unten am Fuß
Weil ich den einfach mit meinem Simplifier Modifier hab runterrechnen lassen. Der ist sowieso noch etwas buggy.
Lord Delvin hat geschrieben:EDIT: wie schwer wärs die Dreiecke durch splines zu ersetzen?
Tja, gute Frage. Ich wüsste das nicht so schnell einzubauen. Du musst bedenken, dass das alles im Pixelshader gemacht werden muss. Da gibs noch nichtmals Rekursion.
kimmi hat geschrieben:Mich hat es die komplette Kiste im Büro abrauchen lassen. Ist alles praktisch eingefroren gewesen. nur ein Neustart hat geholfen.
Ja, tut mir leid... ich hab das natürlich sonst niergendwo getestet... außerdem war das mal ein Spassprojekt für 2 Tage. Da werden weder Caps geprüft, noch sonst irgendwas... also probieren auf eigene Gefahr

Re: [Projekt] GPU Pathtracer

Verfasst: 25.06.2010, 13:53
von Brainsmith
Entschuldigt bitte meine Unwissenheit, aber was ist Pathtracing?? Und was genau macht das Programm??

:D

Re: [Projekt] GPU Pathtracer

Verfasst: 25.06.2010, 14:02
von kimmi
Wenn du die Tests aus Spass noch einbaust, sag ich auch, daß es mir gefällt ;).

Gruß Kimmi

Re: [Projekt] GPU Pathtracer

Verfasst: 25.06.2010, 14:13
von Zudomon
Brainsmith hat geschrieben:Entschuldigt bitte meine Unwissenheit, aber was ist Pathtracing?? Und was genau macht das Programm??
:D
Pathtracing ist eine Erweiterung zum Raytracen. Man versucht, die allgemeine Rendergleichung zu lösen. Ganz genau kann ich das nicht erklären, aber für mich besagt diese, dass die Beleuchtung eines Punktes dem entspricht, was über die Halbkugel der Normale an Licht einstrahlt. Zum Pathtracing findet man viel im Netz.
Das Programm setzt das nun um. Ich weiß, ist jetzt keine Erklärung, was genau das Programm macht, aber ich weiß nicht, was ich dir sonst darauf antworten soll. Statt normal ein Bild zu rendern, werden 2 Dreiecke fullscreen gerendert und was auf den Dreiecken drauf gemalt wird ist dann das gepathtracete Bild.
kimmi hat geschrieben:Wenn du die Tests aus Spass noch einbaust, sag ich auch, daß es mir gefällt .
Ich glaube, den Spass werd ich mir nicht mehr geben. Sonst muss ich mich ja bald auch Krishty anschließen und in den Jammerthread. Das es dir gefällt deute ich einfach mal aus dem letzten Satz deines ersten Posts ;)

Re: [Projekt] GPU Pathtracer

Verfasst: 25.06.2010, 22:31
von Krishty
Du alter Grafikvagabund …

… das sind einerseits zu abgedroschene Spielereien, um nicht den Kopf drüber zu schütteln. Andererseits sehen sie aber auch immer zu gut aus, um sie nicht zu bewundern.

Re: [Projekt] GPU Pathtracer

Verfasst: 28.06.2016, 13:10
von Zudomon
Da ich mittlerweile bei dem Rasterizing ganz klar meine Grenze sehe und keine Lust mehr habe, mir da sonst was zu überlegen, um z.B. Shadowmapping stabiler zu bekommen oder Transparenzen zu erzeugen, wollte ich mich abermals dem Pathtracing zu wenden.
Letztendlich wird es früher oder später sowieso auf eine solche Technik hinaus laufen, also warum dann nicht jetzt schon damit beschäftigen.
Außerdem reizt mich das Thema echt sehr und das schon seit langem!

Somit habe ich dieses alte Projekt wieder rausgekramt, ich hatte es zwischendurch schon einige Male erweitert.

Das ganze läuft immer noch über PixelShader 3.0
Die dargestellte Szene hat mittlerweile 172k Dreiecke.
Verschiedene Texturen und sogar Alphatesting sind bisher möglich.
Da es sich um reines Pathtracing handelt ist es zur Zeit am schnellsten, wenn es eine große Lichtquelle gibt, in dem Fall der Himmel. Da kann man dann auch mit einem vernünftigen Bild (in der bescheidenen Auflösung von 512x512) in 1-3 Sekunden rechnen. Wobei ich bei dem Bild mit dem Glasdrachen etwa 5 Sekunden spendiert habe. :D

zfx1.jpg
zfx2.jpg
zfx3.jpg

Re: [Projekt] GPU Pathtracer

Verfasst: 28.06.2016, 13:23
von marcgfx
Der Glasdrache sieht ja richtig geil aus :O

Re: [Projekt] GPU Pathtracer

Verfasst: 28.06.2016, 13:26
von Schrompf
Der Glasdrache ist echt fett. Auch sonst ist das ein geiles Nerd-Hobby. Nur was Dir das bringen soll, wenn Du keine Lust mehr auf Dreiecke hast, verstehe ich nicht :-)

Re: [Projekt] GPU Pathtracer

Verfasst: 28.06.2016, 13:35
von Zudomon
Schrompf hat geschrieben:Nur was Dir das bringen soll, wenn Du keine Lust mehr auf Dreiecke hast, verstehe ich nicht :-)
Nicht auf Dreiecke habe ich keine Lust mehr, sondern auf diese ganzen Tricksereien um es halbwegs gut aussehen zu lassen... also Schatten / Spiegelungen / Lichtbrechungen / Indirektes Licht / Kaustiken... jedes Thema an sich bringt schon ein ganzes Studium mit sich. Beim Pathtracing hat man das alles mehr oder weniger automatisch. Man muss dann eben an anderen Stelle optimieren.
Aber ja, beim Raytracing bin ich dann natürlich nicht mehr nur auf Dreiecke beschränkt.
Ich würde auch nicht von vornherein sagen, dass Pathtracing wirklich langsamer ist, denn wenn man ähnliche Ergebnisse mit Rasterizing erzeugen will, dann wird es einen Punkt geben, wo dieses langsamer ist. Denn Area-Lights und indirektes Licht sind auch da nicht gratis. Und Spiegelungen / Lichtbrechungen erfordern eine extrem durchdachte Renderpipeline. Wobei auch da sehr massive Grenzen existieren. Da habe ich einfach das Gefühl mit dem Pathtracing wesentlich weiter zu kommen.

Re: [Projekt] GPU Pathtracer

Verfasst: 28.06.2016, 16:45
von scheichs
Heisst konkret: Du stellst StoneQuest auf Pathtracing um?

Re: [Projekt] GPU Pathtracer

Verfasst: 28.06.2016, 17:33
von Jonathan
Hm, ich halte einen Umstieg für nicht sehr sinnvoll. Ich habe neulich erst in einem Talk über nVidia Optix (was du dir vermutlich ansehen solltest) gehört, dass es ein weit verbreiteter Irrglaube ist, Raytracing sei vom Algorithmus her einfacher / eleganter als Rasterisierung. Für simple Implementierungen stimmt das zwar, aber sobald man es richtig schnell haben will und richtig schicke Dinge einbauen will, muss man auch so krude Optimierungen vornehmen, dass von der Eleganz rein gar nichts mehr übrig bleibt. Sprich, genau der Grund aus dem du dahin wechseln möchtest (elegante Algorithmen), wird bei Pathtracing genauso wenig erfüllt. Du wirst genauso bei irgendwelchen Tricksereien laden, um es halbwegs gut aussehen zu lassen, versprochen.

Ich meine, all die Probleme wurden ja schon gelöst. Man findet in der Literatur gute Anleitungen, wie man schöne Schatten erzeugen kann. Natürlich ist es Arbeit, wenn es state-of-the-art sein soll, aber das ist es halt immer. Und es gibt quasi keine geraytracten Spiele, und der Grund dafür wird sein, dass es zuweilen noch nicht taugt. Man hat vor 10 Jahren schon gesagt, Raytracing wird die Zukunft sein, und man wird das aller Voraussicht nach auch in 10 Jahren noch so sagen. Im Offlinerendering kann man damit höchst Erstaunliches erzeugen, aber in Echtzeitanwendungen ist ein bisschen Getrickst plus echt hübsche Assets von nem guten Grafiker das was es gut aussehen und schnell laufen lässt.

ich will gar nicht gegen Pathtracing reden, das ist toll und faszinierend und es macht Spaß, damit zu spielen. Aber vergiss den Gedanken, du könntest StoneQuest irgendwie auf Raytracing umstellen und damit Erfolg haben.

Re: [Projekt] GPU Pathtracer

Verfasst: 28.06.2016, 18:51
von Krishty
Jonathan hat geschrieben:Ich habe neulich erst in einem Talk über nVidia Optix (was du dir vermutlich ansehen solltest) gehört, dass es ein weit verbreiteter Irrglaube ist, Raytracing sei vom Algorithmus her einfacher / eleganter als Rasterisierung. Für simple Implementierungen stimmt das zwar, aber sobald man es richtig schnell haben will und richtig schicke Dinge einbauen will, muss man auch so krude Optimierungen vornehmen, dass von der Eleganz rein gar nichts mehr übrig bleibt.
Davon kann Cat dir ein Lied singen … Katzenjammer quasi. Beides konvergiert zu einem gemeinsamen Optimimum, sagte er, IIRC.

Re: [Projekt] GPU Pathtracer

Verfasst: 28.06.2016, 20:50
von Jonathan
Aber die Bilder sehen ansich echt schick aus. Die Beleuchtung ist zwar unglaublich diffuse, aber dafür sehen die Bilder wirklich rauschfrei aus. magst du ein bisschen detaillierter erklären, wie das gerendert ist (im Sinne von: Wie viele Strahlen; usw.)?

Re: [Projekt] GPU Pathtracer

Verfasst: 28.06.2016, 22:42
von Zudomon
Jonathan hat geschrieben:Wie viele Strahlen; usw.
Das kann ich gar nicht so genau... weil das ja iterativ ist und auch nicht gleichverteilt im Bild.
Es funktioniert auch nur so "schnell", weil eben ein großer Himmel die Strahlen direkt schluckt und als Lichtquelle dient. Ist die Lichtquelle klein, hab ich nach Minuten noch kein vernünftiges Ergebnis. Aber vielleicht hilft mir dann bidrektionales path tracing weiter... aber erstmal verstehen.
Hier sieht man, was ich meine:

Skybox als Himmel:
2.png
Lichtquelle:
1.png


Das obere ist nach wenigen Sekunden ziemlich perfekt während das untere noch nach Minuten Bandings hat. Rauschen statt Bandings wären vielleicht besser, aber ich glaube, wesentlich ungünstiger, da es ja darum geht, das möglichst viele Pixel den gleichen Flow-Control Pfad einschlagen.

Re: [Projekt] GPU Pathtracer

Verfasst: 28.06.2016, 23:41
von Krishty
Bilder vertauscht?

Re: [Projekt] GPU Pathtracer

Verfasst: 29.06.2016, 00:04
von marcgfx
Wenn du keine 60 fps hinbekommst ist es vermutlich sowieso unnütz, oder irr ich mich?
Ich hab vor jahren mal ein javascript raytracing experiment gemacht, mit ganz simpler geometrie... hab mich gewundert wie schnell ich das hinbekomme. ich wollte es eben verlinken, aber hab den server gar nimmer :P ... egal

Re: [Projekt] GPU Pathtracer

Verfasst: 29.06.2016, 01:43
von Zudomon
Krishty hat geschrieben:Bilder vertauscht?
Stimmt! Sorry, habs korrigiert! :D
marcgfx hat geschrieben:Wenn du keine 60 fps hinbekommst ist es vermutlich sowieso unnütz, oder irr ich mich?
Ich hab vor jahren mal ein javascript raytracing experiment gemacht, mit ganz simpler geometrie... hab mich gewundert wie schnell ich das hinbekomme. ich wollte es eben verlinken, aber hab den server gar nimmer :P ... egal
Ich bin mir da absolut unschlüssig... brigade zeigt, dass man damit auf jeden Fall schon abgehen kann.
Das Problem ist eben, wenn man ne Menge Shadowmaps hat, sich um Ambient Occlusion kümmert, SSAO, Reflektionen (planar bzw. cubes) einbaut, vielleicht noch so ein paar Tricks, damit es besser aussieht, vielleicht noch screen space reflektions, ein paar Renderpipeline Tricks, damit man transparentes und Lichtbrechungen rendern kann (was aber sicherlich Sonderfälle in Bezug auf das rendering), vielleicht dann noch indirekte Beleuchtung, dann wird es ganz schnell auch mit Rasterizing ziemlich langsam. Und ich vermute ja mal, dass es irgendwo einen Breakeven Punkt gibt, wo man mit Pathtracing einfach besser hinkommt.
Ich muss einfach mal schauen, wie weit man damit kommt wenn man sich noch ein paar mehr Optimierungen einfallen lässt...

Re: [Projekt] GPU Pathtracer

Verfasst: 29.06.2016, 05:28
von Zudomon
Hmm... wenn die Lichtquelle direkt gesampelt wird, dann ist das schon ganz schön krass!
Auf dem Bild mit dem Kristall sah man ja gut, wie schlecht das ganze selbst nach Minuten aussieht.

Nun hab ich hier ein Bild, Renderzeit 5,3 sek auf 1024² :D
directlight.jpg
Hier noch eine komplexere Szene mit etwas über 630k Dreiecke, 1024², Renderzeit 21,3 sek
directlight2.jpg

Re: [Projekt] GPU Pathtracer

Verfasst: 29.06.2016, 07:34
von Zudomon
Tja, irgendwie hatte ich da noch ein Fehler bei der diffuse Lichtübertragung. Das blöde ist, dass mir solche Fehler kaum auffallen. Aber nun scheint es richtig zu sein. Habe auch mal den hochaufgelösten Drachen genommen.

Etwa 5 Sekunden bei 512²
1.jpg
Und hier nochmal direkt aus StoneQuest, auf Ultra, was etwa 250 mal schneller rendert (20 ms) aber damit man besser Vergleichen kann ohne Normalmapping

1_sq.jpg


Irgendwie sieht das schon recht ähnlich aus... naja. Hätte gedacht, der Unterschied wäre nun doch etwas größer qualitativ.

Re: [Projekt] GPU Pathtracer

Verfasst: 29.06.2016, 08:43
von Schrompf
Ich find's halt als Nerdhobby sehr geil. Für den Wirkungseinsatz in nem Spiel dagegen - ich glaube, Raytracing ist der Fusionsreaktor der Echtzeitgrafik. Aller 10 Jahre heißt es "noch 10 Jahre". Und da die Hardwareentwicklung aufgrund physikalischer Grenzen so langsam in die Sättigung geht, wird die aktuelle Prognose eher "noch 20 Jahre" lauten.

Optische Unterschiede: schau ins Dunkle. Mit nem Path Tracer kriegst Du die ganzen indirekten Lichtanteile geschenkt. Die obere Mundhöhle des Drachen z.B. zeigt das ganz gut. Da kann Path Tracing glänzen. Bereiche im Sonnenlicht dagegen werden von energetisch von einer einzelnen Komponente dominiert, und die nichtlineare Wahrnehmung des Auges sorgt halt dafür, dass man dann praktisch nur die sieht. Und diese Bereiche sind leider nach wirklich *jedem* Maßstab besser mit Rasterizing umzusetzen - Raytracing wird da prinzipiell immer abstinken.

Re: [Projekt] GPU Pathtracer

Verfasst: 29.06.2016, 11:09
von marcgfx
Ich finde den Unterschied im Standbild merklich. In Bewegung und im Spiel wird es wahrscheinlich weniger auffällig sein. Das Pathtracing um Factor 250 schneller machen dürfte ganz schön schwer werden. Ich warte immer noch auf ein eigentliches Spiel :P

Re: [Projekt] GPU Pathtracer

Verfasst: 29.06.2016, 14:46
von Jonathan
Kriegst du es hin, die Szene mit den exakt gleichen Kamerawerten zu rendern? Zu dass man im Grunde eine Pixelgenaue Übereinstimmung hat?

Re: [Projekt] GPU Pathtracer

Verfasst: 29.06.2016, 15:08
von Zudomon
Jonathan hat geschrieben:Kriegst du es hin, die Szene mit den exakt gleichen Kamerawerten zu rendern? Zu dass man im Grunde eine Pixelgenaue Übereinstimmung hat?
Blöderweise wohl erstmal nicht ohne da auch Arbeit zu investieren.

Re: [Projekt] GPU Pathtracer

Verfasst: 30.06.2016, 18:29
von Zudomon
marcgfx hat geschrieben:Wenn du keine 60 fps hinbekommst ist es vermutlich sowieso unnütz, oder irr ich mich?
Ich halte das Ganze nicht für unnütz, denn selbst wenn ein reiner Pathtracer am Ende nicht Echtzeittauglich ist, so kann man sicher Elemente daraus auch für normales Rasterizing verwenden.

Hier noch ein paar 512² Bilder mit der 172k Szene und einer Punktlichtquelle... :D

3,5 Sekunden:
point1_3-5.jpg
4,4 Sekunden:
point2_4-4.jpg
3,5 Sekunden:
point3_3-5.jpg

Re: [Projekt] GPU Pathtracer

Verfasst: 02.07.2016, 12:19
von Zudomon
Ich habe mir mal ein Objekt zum testen von TurboSquid geholt...
http://www.turbosquid.com/FullPreview/I ... /ID/929456

512x512
Renderzeit 31 Sekunden
test.jpg


Am Regal rechts oben sieht man gut, wie Licht auch zurück geworfen wird.
Was man meiner Meinung nach auch sehr wichtig ist, aber durch heutige Licht Indirektionsverfahren (da meist grob Voxelbasiert) fehlt, sind die scharfen indirekten Schatten, die man gut unter den Stuhlbeinen sieht.
Ganz schwach sind noch Bandings zu sehen im Bild, es hätte ruhig noch länger rendern können.
Aber die Frage ist nun, wie bekommt man das nun in auf Echtzeit?! :D
Ich denke mal, das es letztendlich auf ein Hybrid hinausläuft.
Das direkte Licht berechnet sehr schnell, das indirekte braucht auch nicht so lange, wenn die Flächen nicht weiß sind, da durch die Texturen das Licht schnell an Energie verliert.

EDIT: Bei Interesse kann ich gerne mehr Screens machen, auch in höherer Auflösung. Weiß halt nie, ob es interessant genug ist.

Re: [Projekt] GPU Pathtracer

Verfasst: 02.07.2016, 13:13
von Zudomon
Oh nein... bei meiner ganzen Optimiererei hab ich gerade festgestellt, dass das Mitteln der Pixel verbuggt ist... damit ist das Ergebnis allerdings komplett falsch... :D