PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 3D Spiele als DepthMap ausgeben lassen?


moswanted
2006-07-29, 11:43:21
Hallo!

Zuerst: Ich hab von Grafik in diesem Bereich keine Ahnung, also bitte falsche Begriffsnutzung oder Ahnliches gepflegt ignorieren.

Ich würde gerne moderne 3D-Spiele als Graustufenbild basierend auf der DepthMap ausgeben lassen. Ist sowas möglich, eventuell per OpenGL- Customshader? Ich meine gesehen zu haben, dass man bei aktuellen ATI-Treibern solche einladen kann.
Wenn ja, gibt es solche Möglichkeiten und/oder wie einfach wäre sowas in der Programmierung? Am idealsten wäre, wenn das Spiel im Funktionsumfang uneingeschränkt wäre, die Grafikkarte jedoch nur die Depthmap als reines Graustufenbild rendert.

Danke im Vorraus fürs Lesen und für Input,

mos

Coda
2006-07-29, 12:26:14
Das ATI-Zeug beschränkt sich auf Postprocessing - ich glaube nicht dass man da noch den Z-Buffer als Input hat. Ansonsten wäre es einfach.

moswanted
2006-07-29, 13:04:51
Was bestehen denn für Möglichkeiten abseits vom ATI-Customshader? Gibts irgendne Möglichkeit, der Karte mitzuteilen, dass sie eben nichts anderes als die DepthMap in Graustufe ausgeben soll? An wen könnte ich mich sonst noch wenden, der sich mit sowas auskennt?

Danke schonmal für die Hilfe!

Coda
2006-07-29, 13:40:52
Höchstens mit DXTweaker, aber ich weiß nicht ob der das kann.

moswanted
2006-07-31, 19:33:23
DXTweaker kann es leider nicht. Alle weiteren Vorschläge herzlich willkommen.

RaumKraehe
2006-07-31, 20:02:52
Ich kann dir zwar nicht Helfen, bin aber ein neugieriger Mensch und würde ja gerne mal wissen wozu du diese Funktion brauchst. :)

tokugawa
2006-08-01, 04:16:42
Unter OpenGL geht's eventuell mit Debugging-Tools wie GLTrace oder ähnlichem, die die GL-Calls abfangen und "aufnehmen" können.

Damit kann man zumindest auch Content aus einem Spiel klauen über die API-Calls.

moswanted
2006-08-01, 17:45:12
Danke für den Tip, hab GLTrace mal getestet. Die richtigen Befehle werden auch geloggt, leider bin ich nur 0 fit im Programmieren und wüsste nicht, wie ich das hooken sollte um an dei ZBuffer Daten zu kommen. Die müssten dann auch nich in Einzelbilder geschrieben werden und und und... einfach ne nummer zu groß für mich. Ich bräuchte die DepthMap für DepthOfField postprocessing.

Dank Euch!

del_4901
2006-08-01, 20:07:48
Du kannst versuchen die opengl Funktionen Abzufangen, und durchzureichen. Ganz speziell änderst du dann nur den swapBuffers Aufruf. Da kannst du dir dann was ausdenken wie du es machst entwerder schreibst du nach dem Aufruf die tiefenwerte in ein Rendertarget. Oder holst es dir vor dem Aufruf über glFunktionen. Dann kannst du dort auch gleich vor dem Aufruf deinen DoF-Postprocess "einhängen". Das hängt nun mitunter leider alles am seidenen Faden, weil das mit den Rendertargets nicht in jedem Fall funktioniert, und die copyPixel variante ist sehr sehr langsam. Außerdem kann es zu Problemen kommen, jeh nach Art der Implementierung, weil nach dem Aufruf von SwapBuffers der Inhalt des Framebuffers undefiniert ist.

Frag mich jetzt aber nicht wie man das genau macht, das hab ich noch nie gemacht, ich weiß nur das es geht. GLTrace beweißt das ja. Ich gleubae der Zeckensack hat sowas ähnliches schonmal gemacht.

Damit du aber mit den Z-werten was anfangen kannst, brauchst du noch die Projection-Matrix, die müstet du dir auf ähnliche Art und Weise besorgen. weil du weißt nie ob das Game nicht in einigen Fällen eine andere Matrix verwendet, und dann stimmen auf einmal die "Abstände" nicht mehr.

moswanted
2006-08-02, 10:14:44
Danke für die detaillierte Antwort, AlphaTier. Da ich sowohl im Programmieren als auch im openGL Bereich nichts kann, müsste ich mich einigermaßen einlesen und beschäftigen damit. Ich fürchte, dass ich dafür keine Zeit haben werde. Ich hatte gehofft, dass es eine einfachere und zeitsparendere Variante gäbe. Ich habe bereits Möglichkeiten gefunden, um bei bestimmten Spielen diesen Effekt zu erzielen, er ist aber sehr trickreich und relativ aufwändig. Hatte deswegen gehofft, das ganze grundlegender aufziehen zu können um es Spiel-/Engine-unabhängig zu machen. Würd mich reizen, nur die liebe Zeit fehlt.

Danke nochmal,

mos