Ambient Occlusion
-
Hallo C++ Freunde!
Ich wollte für eine statische Szene Ambient Occlusion umsetzen (so einfach wie möglich)
. Ich habe verschiedene Verfahren im Internet entdeckt, und bin jetzt etwas durcheinander geraten. Ich wollte das Projekt unter Ubuntu 11.04 umsetzen und Shader einsetzen(HSL)(OpenGL).
Meine Idee wäre recht einfach gehalten!
Ich lese den Z-Buffer aus, und erhalte für jedes sichtbare Pixel einen Tiefenwert. Pixel mit einem Tiefenwert von 1 berücksichtige ich dabei nicht, weil Hintergrund. Für ein Tiefenwert könnte ich doch jetzt anhand einer Rückprojektion den Raumpunkt ermitteln, der sichtbar ist. Von diesem sichtbaren Raumpunkt aus sende ich dann z.B. 12 Strahlen in die Szene aus. Anschließen zähle ich die Anzahl der Schnittpunkte, die dann den Schattierungsfaktor bestimmen. Den Schattierungsfaktor könnte ich in eine Textur speichern, der die gleiche Größe aufweist wie der Frontbuffer! Der letze Schritt wäre ein Aplha Blending mit der Schattierungs-Textur vorzunehmen.
Ist der Grundgedanke OK? Es soll wirklich eine einfache Umsetzung werden!Kann Jemand einen Tipp geben?
Grüße
-
Wenn du die AO nur statisch vorberechnen willst, dann würd ich das wohl einfach per Vertex machen (die Information ist in der Regel eher sehr niederfrequent). Da brauchst du weder Shader noch Z-Buffer noch OpenGL. Über jeden Vertex stellst du deine Hemispähre und samplest die Szene mit ein paar Strahlen da durch. Resultat ist ein AO Wert pro Vertex.
-
@HelloWorld
Willst du Screen Space Ambient Occlusion machen oder World Space Ambient Occlusion?
Oder ist dir das egal?
-
Zur Zeit habe ich das so, dass ich mit einem externen Programm die Geometry berechne (Schnittpunkte, Richtungsvektor). Das Programm gibt mir ein XML File zurück, auf das ich mit meinen OpenGL Programm zugreifen möchte. Die Parameter die ich aus dem XML-File bekomme nutze ich für den Pixel Shader und den Fragment-Shader.
Willst du Screen Space Ambient Occlusion machen oder World Space Ambient Occlusion?
Oder ist dir das egal?Welches Verfahren ist eigentlich egal! Es soll nur einfach zu verstehen und mit Schader umsetzbar sein. Für eine statische Szene! Das gleiche wollte ich auch für einen Realtime-Raytracer umsetzen wie Z.B. RTFact.
Nur muss ich erst einmal schauen, dass ich an die Software komme (Beispiel,RTFact)
Grüße