Wie erhalte ich den Depthbuffer mit Direct3D9



  • Hallo zusammen
    Also ich bin hier bald mal ein wenig am durchdrehen. Ich möchte einfach den Depth Buffer auslesen für einen DOF Effekt. Das kann doch nicht so schwer sein, aber egal wie ich es anstelle, es scheint nicht zu funktionieren. Also dies vorweg, ich habe nicht vor, die gesamte Scene 2mal zu rendern, das wäre IMHO völlig idiotisch, die Tiefeninformationen sind ja durch das Z-Buffering vorhanden und genau diese Daten will ich haben. Also wie macht man das? Ich habe es versucht mit GetDepthStencilSurface, aber ich kriege diese Daten partout nicht in eine Textur, ich meine alleine die Lock Operation versucht ein fps Rückfall von 180fps auf ca. 60 fps 😮 soll das ein schlechter Scherz sein??

    Mfg Samuel



  • Der einzige Weg um in D3D9 den DepthBuffer als Textur zu lesen führt über Treiberhacks mit herstellerspezifischen Texturformaten (INTZ, RAWZ, ...).
    In reinem D3D9 bleibt dir nichts andres übrig als die Tiefe per Pixelshader in eine eigene Textur zu rendern (du könntest evtl. Multiple Rendertargets benutzen um nicht extra nur dafür einen Pass rendern zu müssen). Bedenke dass die Werte im DepthBuffer stark nichtlinear sind. Selber rendern hat den Vorteil dass du z.B. lineare Viewspace Depth in eine Float Textur rendern könntest was evtl. vor allem aus qualitativen Gründen den Aufwand Wert sein kann.



  • @dot
    Heisst das, ich muss die Distanz der Kameraposition zu jedem Vertex berechnen, obwohl eigentlich die z-Unit der Grafikkarte genau dasselbe bereits tut?



  • @dot
    Ich nehms zurück, spielt keine Rolle, denn das muss ich ja ohnehin bereits für das Fogging machen.



  • Also prinzipiell funktioniert es nun mit mehreren parallelen Rendertargets, aber es harzt am Detail. Namentlich werden (teil)transparente Polygone nicht korrekt in die Depthmap geschrieben. Gibt es eine Möglichkeit, Alphablending für ein Rendertarget zu aktivieren, während es für das Andere deaktiviert bleibt?



  • Nein gibt es nicht. Alphablending mit MRTs ist sowieso so eine Sache, das muss in D3D9 nicht unbedingt jede Graka unterstützen. Außerdem definiere mal "nicht korrekt". Bei reinem Alphablending wird in jedem Fall ein Depthwert geschrieben, meinst du vielleicht Alphatesting?



  • @dot
    Aber wenn das D3DPMISCCAPS_MRTPOSTPIXELSHADERBLENDING Flag gesetzt ist, funktioniert das schon oder? Also ich habe eine Liste der Grakas die das unterstützt und diejenigen, die es nicht unterstützen, unterstützen IMHO auch kein Hardware Vertex Fetching, welches wir ja für diverse Effekte benötigen oder sehe ich das falsch?

    Ja vielleicht hat es mit Alphatesting zu tun, das Problem ist, dass das Depth of View momentan noch nicht korrekt mit dem Partikelsystem zusammenarbeitet.


Anmelden zum Antworten