Raytracing - Ich brauche neue Ideen was ich an den Bild noch verbessern kann
-
Hallo Leute,
Winterzeit ist Raytracingzeit. Das hat bei mir Tradition bekommen^^ Ich habe mich die letzten Monate mit Godrays, Motion Blur und mein Textureditor beschäftigt, um mein Säulenbüro zu verbessern.
Das ist der Stand jetzt:
https://picload.org/image/rogiggwc/saeulenbueromitgodraysundmotio.jpg
So siehts ohne die Godrays aus
https://picload.org/image/rogiggwp/bidirectionalpathtracing3.jpg
Und das bei Nacht
https://picload.org/image/rogiggwo/bidirectionalpathtracing4.jpg
Habt ihr noch paar Ideen, wie ich die Bilder noch verbessern kann? Irgendwelche neuen Effekte/Materialien oder sonstwas. Der Winter ist noch nicht vorbei und ich habe noch überschüssige Energie, die ich in den Raytracer stecken will.
-
Constructive Solid Geometry
Leicht zu implementieren und kann trotzdem interessante Ergebnisse liefern.Tiefenunschärfe
Noch leichter zu implementieren braucht aber relativ viel Rechenzeit.Photon Mapping
Deutlich mehr Aufwand; erst recht wenn man den kd-Baum selbst macht.Ansonsten wirken die Säulen recht eckig. Gerade Raytracing bietet sich an runde Objekte auch wirklich rund darzustellen und nicht nur über Polygone anzunähren.
Da du Spiegelung scheinbar schon hast gehe ich davon aus, dass du auch schon Lichtbrechung an z.B. Glas hast.
-
Was ich selbst noch nicht gemacht habe aber auch einfach sein sollte ist Bumpmapping.
Oder (ohne direkt sichtbare Verbesserung) versuchen den Raytracer mit einer Bounding Volume Hierachy beschleunigen.
-
als erstes die bugs fixen
- schwarzen pixel, vermutlich irgendwo NANs
- anti aliasing im nachtbild -> an lichtquellen und an fenstern schaut kaputt aus
- vielleicht ein wenig am tonemapping arbeiten. das bild schaut ein wenig "langweilig" aus in der hinsicht. color clamping beim weiss und alles graeulich. Speicher dir dein rendering mal als z.b. .HDR hab und benutze ein externes tool, du wirst staunen wieviel besser dein bild aussehen kann
-soll das chrome am stuhl sein? schaut ein wenig komisch aus. (aber das mag vielleicht auch am tonemapping liegen)schoen zu sehen dass du das texture filtering so sauber hinbekommen hast, motioin blur schaut auch nett aus.
ich glaube du haettest spass den tracer auf spectral umzustellen. statt rot-gruen-blau, verfolgst du wellenlaengen und rechnest dafuer spezifische lichtbrechung etc.
das ist recht einfach, macht rendering vermutlich 10x langsammer, kann aber echt nette effekte produzieren. (prisma, regenbogen, eigentlich auch blauen himmel).
-
@PRay: Dieses Constructive Solid Geometry dient doch eher zu Modelierung von Objekten. Dafür nutze ich blender. Bei mein Raytracer will ich mich wirklich nur auf die Darstellung konzentrieren
Tiefenunschärfe habe ich schon dabei aber in dieser Szene nicht eingeschaltet. Für diese Bilder hier nutze ich Bidirectionales Pathtracing und Photonbeams. Photonmapping habe ich vor 2 Jahren schon implementiert. Das läuft also auch schon^^ Und anstelle einfaches Bumpmapping nutze ich Parallax-Mapping. Also Beschleunigungsstruktur nutze ich bereits Bounding Intervall Hierachy.
Der Punkt mit den Säulen ist aber richtig von dir. Mein Raytracer hat entweder die Möglichkeit die Normalen Flat zu interpolieren oder über alle 3 Eckpunkte von ein Dreieck. Damit kann ich also Würfel/Wände und runde Objekte darstellen. Was aber ncch nicht geht sind Rotationsobjekte. Dafür benötige ich einen eigenen Shader, über welchen ich diese Nacht drüber nachgedachte habe. Guter Punkt also von dir.
Das mit den schwarzen Pixel stört mich auch. Komischerweise scheint es nur die Szene zu betreffen, wo auch die Photonbeams verwendet werden. Dem muss ich mich annehmen.
Antialiasing stimme ich dir voll und ganz zu. Das stört mich auch am Nachtbild.
Das mit den Tonemapping könnte glaube an den Attenuation-Faktor von der Luft liegen. Ich werde den mal etwas runter setzen, um somit diesen gräulichen Schleier wegzubekommen.
Das Stuhlbeinproblem kennen wir doch von woanders her schon :p Ich hatte doch schon vor 2 Jahren bei mein Photonmapping mich hier übelst angestellt^^
Ein Arbeitskollege hatte noch zwei Ideen:
Wenn die Säulen dann erstmal runder sind, dann muss ein Glanzpunkteffekt hinzu.
Außerdem meinte er, ich soll mal höher augelößte Texturen verwenden damit das nicht so pixelig aussieht.Wenn denn spectrales Raytraing auch 'normale' Alltagsszene verbessern könnte, dann würde ich das ja machen. Was mich stört ist, dass es nur für ganz bestimmte unscheinbare Effekte gut zu sein scheint.
Momentan beträgt die Renderzeit für das Bild in der großen Auflösung noch 10 Stunden. Es gibt da ein Verfahren, was VCM (Habe ich letzten Winter gemacht) und Metropolis verbindet.
http://www.ci.i.u-tokyo.ac.jp/~hachisuka/ups-vcm_mcmc.pdf
Ich will mal sehen, ob ich damit die Renderzeit noch mal mehr senken kann. Das war noch so ein kleiner Plan von mir.
Wenn hier noch weitere Leute Idee haben, dann nur her damit.
-
Das Schwarze-Pixel-Problem und das Antialiasing-Problem konnte ich nun lösen.
Das mit den grauen Schleier beim Godray-Bild auch, indem ich am Scattering-Factor von der Luft was gedreht habe.
Ich kann dann erst nächste Woche die Ergebnissbilder vom Säulenbüro zeigen, da mein Rechner zuhause fürs Raytracing zu langsam ist (i3)
-
So siehts nun ohne schwarze Pixel und mit Antialiasing aus.
https://picload.org/image/roriorag/saeulenbueroohnegodrays.jpg
https://picload.org/image/roriordp/saeulenbueromitgodraysundmotio.jpg
Ich habe die Säulen noch etwas runder gemacht. Der Glanzpunkteffekt ist dadurch aber nicht entstanden.
Hat jemand eine Idee, woran das liegt? Bei der anderen Szene mit den grünen Ring sieht man ja, dass dort der Glanzpunkteffekt funktioniert. Ich nehme bei den Säulen das gleiche Material.
Gibts hier eigentlich noch mehr Leute, die Interesse an Raytracing haben? Ich überlege, ob ich irgendwann mal ein Tutorial oder so machen, wo ich Bidirectionales Pathtracing, Photonmapping und das Hintergrundwissen dazu erkläre.
Wenn jemand aber bereits ein guten Link zu den Thema Pathspace, Pfadwahrscheinlichkeit berechnen, Multiple Importance Sampling, Brdf/Lightsampling,... hat, dann kann er ihn natürlich gerne hier nennen. Ich selbst fand die Erklärungen im Internet sehr schwierig und ich musste viel Zeit investieren, um das alles zu verstehen. Deswegen überlege ich halt, ob ich das mal so gut es geht, erklären könnte. Wenn es aber keinen Menschen gibt, der sonst Interesse an Raytracing hat, dann lass ich das aber erstmal sein und beobachte einfach nur
-
was genau meinst du mit "Glanzpunkteffekt". Ich kenne diesen Terminus nicht. (Ich kann mir einiges darunter vorstellen). Specular highlight?
Einen Artikel kannst du gerne schreiben, wenn es gut wird, bekommt es einen sticky. vielleicht ueberrede ich die anderen mods das auch in unser c++ Magazin noch aufzunehmen.
-
Ja genau, ich meine damit Specular highlights.
Appropos Specular Highlights. Die Bilder sehen deswegen so ausgewaschen aus, weil ich dort bei mein Material bei den Säulen und beim Fußboden versucht habe, diese hinzufügen, was aber nicht geklappt hat. Jetzt wo ich wieder ein rein Diffuses Material habe, sehen die Farben wieder schön kräftig aus.
Ich glaube, ich werde jetzt mal als nächstes mich diesen Specular-Thema annehmen.
-
achso
ein specular fuegt man nicht einfach dazu, das wird von oberflaeche, material und lichtquelle definiert.
jetzt verstehe ich weshalb es so desaturiert ausschaut, du hast nur diffuse, also lambert? dot(normal,lightdir)?path tracer ohny rightige materialien macht nicht soviel sinn, du verschwendest all die komplexen und zeitaufwendigen berechnungen fuer diffuse. erst mit guten materialien wird es "echt" aussehen.
schau dir z.B.
http://renderwonk.com/publications/s2010-shading-course/hoffman/s2010_physically_based_shading_hoffman_a.pdfund den rest in
http://renderwonk.com/publications/s2010-shading-course/
dazu
http://blog.selfshadow.com/publications/s2012-shading-course/
an
-
Ok, ich sehe, dass dort Subsurface-Scattering, Microfacetts, Blinn-Phong und sonste wie viele Brdfs. Genannt werden.
Ich werde sie mir anschauen und in einer Extra-Testscene erstmal einzeln untersuchen.
Hättest du ein Tipp, welche Brdfs für die Säulen und den Fußboden ich da nehmen könnte? Es sind so viele und ich muss mir da erstmal ein Überblick verschaffen, was davon am Besten für diese beiden Objekttypen von mir passen würde.
@Edit: Ich habe mir die Folien angesehen und beim Thema Microfacet-Brdfs scheint es genau eine Masterformel zu geben, welche sich aus FresnelTerm, GeometryTerm und NormalDistriution zusammen setzt. Diese Formel wird sowohl in dein 1. Link als auch hier beschrieben:
http://simonstechblog.blogspot.de/2011/12/microfacet-brdf.html
Ich habe das Material bei mir eingesetzt. Die gute Nachricht. Beim meiner Ring-Scene zeigt es die Specular Highlights weiterhin schön. Bei der Säulenszene ist dieser Auswascheffekt weg. Die schlechte Nachricht. Es scheint ansonsten keinen Effekt zu haben. Es sieht weiterhin so aus, als ob ich diffuses Material habe.
Bei all den Beispielen, wo Brdfs vorgestellt werden, wird ja meist immer mit direktem Licht gearbeitet. Mein Säulenbüro besteht aber zu 90% aus indirekten Licht. Vielleicht ist das ja der Grund, wiso ich diesen Effekt da nicht sehe.
-
ja, die meisten spiele nutzen zu 99% nur ein brdf. auch viele renderer nutzen nur wenige brdfs.
die idee ist, dass es eigentlich ein einziges brdf-model geben kann, das einzig durch verschiedene parameter die oberflaecheneingeschaften beschreibt. das problem ist, dass die simulation davon extrem aufwendig waere, denn dazu gehoert subsurface scatterin genau so wie atmospheric scattering etc.
deswegen spezialisiert man ein paar. oft
- metalle (specular ist bunt, basis material ist gray)
- nicht metalle (dielectrics) bunte basis, weisses specular
- subsurface scattering (meistens nur sehr duennes, z.b. haut, pflanzenblaetter etc.) BSSRDF
- participating media (rauch)
- atmospheric effects (meist in clouds und sky aufgeteilt)
- anisotropische materialien (ging zwar mit dielectrics, aber die parametrisierung ist ein wenig komplexer und das will man nicht grundsaetzlich haben.
- caustic materials (glass, wasser,...)
- fur (fell, bzw rasen, tepich, stoff gehoert da oft dazu). BRTFdazu gibt es oft analytische formel. beim path tracen nutzt man manchmal auch gemessene werte, im einfachsten fall http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter11.html
wenn du metalle und dielectrics erstmal implementierst, solltest du deine scene sehr gut ausleuchten koennen.
-
Sehr schön, deine Hinweise und Link hilft mir jetzt erstmal wieder weiter. Ich werde jetzt erstmal versuchen das weiter zu verstehen/umusetzen.
Dieses Thema mit der Anzeige von Kleidung/Kissen interessiert mich schon lange und ich wußte einfach nicht, unter welchen Begriff ich das googeln muss.
-
-
Ich habe am WE jetzt eine neue Szene angefangen. Hier nun erstmal die Abschlussbilder von der alten Szene.
Diffuses Material:
https://picload.org/image/rodpolir/saeulenbueromitgodraysundmotio.jpg
https://picload.org/image/rodpolia/saeulenbueroohnegodrays.jpgMit Specular Highlights
https://picload.org/image/rodpolci/god_phong.png
https://picload.org/image/rodpolcw/nogodbipath.pngMein nächstes Bild wird diesmal eine Nahaufnahme von kleinen Gegenständen sein. Sowas muss auch mal sein^^ Dort möchte ich mich um Subsurface Scattering kümmern.
Ohne Tiefenunschärfe:
https://picload.org/image/rodpowrg/test.pngMit Tiefenunschärfe
https://picload.org/image/rodwgpll/test.png
-
schnapp dir doch eine der vielen referenz szenen. dann kannst du deine resultate auch mit dem wie es aussehen sollte vergleichen
was ist das da links auf der Saeule? https://img1.picload.org/image/rodpolir/saeulenbueromitgodraysundmotio.jpg
Schaut ein wenig aus als ob du durchs objekt tracen wuerdest.
-
Wo finde ich diese Referenz-Bilder? Bei einer kurzen Google-Suche fand ich nichts.
Meinst du die vertikal verlaufende Rille bei der Säule?
-
ganz ganz ganz links, am unteren rand der dritten kachel von oben.
DIE REFENREZ ist die cornell box, weil die Wissenschaftlich diese box erst im echten Leben ausgemessen haben und dann mit dem rendering vergleichen:
http://www.graphics.cornell.edu/online/box/
http://www.graphics.cornell.edu/online/box/compare.html.Blender hat einige test szenen, dieser subd affen kopf, oder z.B. http://blenderdiplom.com/en/downloads/584-download-cycles-material-test-scene.html
oder
https://code.blender.org/2016/02/new-cycles-benchmark/einige nette szenen (z.B. ist Sponza eine sehr sehr gaengige szene zu der du viele renderings finden solltest):
http://graphics.cs.williams.edu/data/meshes.xml
-
Ok das mit diesen weißen Streusel ist mir auch schon aufgefallen und ich habe mich drüber gewundert^^ Ich nehms einfach erstmal in meine Liste der offenen Fragen/Fehler auf.
Klingt nach einer guten Idee sich an diesen Benchmarkt-Szenen zu testen. Die Cornellbox kenne ich natürlich aber ist mir jetzt gerade beim Verfassen von mein letzten Beitrag nicht sofort eingefallen.
Ich denke mal, bis ich diese ganzen 'Tests' geschaft habe, dürfte noch sehr viel Arbeit sein. Es geht hier ja nicht einfach nur um globale Beleuchtung sondern auch um das ganze Material-Zeug. Schön wärs noch, wenn ich auch noch gegen die Renderzeit arbeiten/vergleichen dürfte, nachdem der Bildvergleich geschaft ist.
Du hast mich mit dein Link für diese Blender-Datei noch auf eine weitere gute Idee gebracht. Ich könnte doch einfach mal anfangen mir Anzusehen, wie man den Raytracer von Blender benutzt und diesen dann nehmen, um Referenzbilder zu erzeugen. Bei Blender arbeiten doch Leute, die Ahnung haben^^
-
du kannst auch deinen raytracer in blender einbinden.
hm, ja, mir klingt es als ob dein tracer recht langsam ist. vielleicht lohnt es sich daran zu arbeiten? Mit jeder verdopplung der geschwindigkeit wirst du doppelt so schnell progress machen beim entwickeln, weil du nur die haelfte wartest
installier dir CodeXL, starte deinen tracer und dann auf "profile" und dort "attach to process" und profile deinen tracer mal 2minuten
vielleicht hast du funktionen die langsam sind, die du nicht erwartet haettest und du kannst mit einem fingerschnippen viel zeit sparen.
ansonsten poste hier die top offenders und wir koennen vielleicht tipps geben.
-
Das mit den Profiler kann ich gerne machen aber ich glaube kaum, dass ich da mit CodeXL arbeiten kann. Das ist ein reines C#-Projekt. Dafür kann ich bereits den Profiler von Visual Studio nutzen, um mir das mal anzusehen was da hängt.
Was ich z.B. mal rausgefunden habe ist, dass man bei der Vektor-Klasse sowas nicht machen darf:
class Vector { public float[] Numbers = new float[]{0,0,0}; }
Macht man es stattdessen so, dann ist die Raytracingzeit halb so viel:
class Vector { public float X = 0; public float Y = 0; public float Z = 0; }
D.h. einfach nur die Multiplikation + Addition von einer Adresse, um im Array auf ein Element zuzugreifen, macht das ganze schon so übelst langsamer.