OpenGL, wie Sie mit depthbuffer vom framebuffer als die üblichen depth-buffer
Habe ich frame-Puffer, mit Tiefe-Komponente und 4-Farb-Anlagen mit 4 Texturen
Ziehe ich ein paar Sachen hinein und lösen Sie den Puffer nach, mit 4 Texturen für fragment-shader (deferred lighting).
Später will ich ziehen ein paar mehr Sachen auf dem Bildschirm, mit der depth-buffer aus meiner framebuffer, ist es möglich?
Ich habe versucht, die Bindung der framebuffer wieder und die Angabe glDrawBuffer(GL_FRONT), aber es funktioniert nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie Nicol schon sagte, Sie können eine FBOs Tiefe Puffer als Standard-framebuffer Sie den depth-buffer direkt.
Aber Sie können kopieren Sie die FBO den depth-buffer über den Standard-framebuffer mit der EXT_framebuffer_blit Erweiterung (das sollte der Kern da GL 3):
Wenn diese Erweiterung nicht unterstützt wird (was ich bezweifle, wenn Sie bereits haben, FBOs), die Sie verwenden können, eine Tiefe textur für die FBO ' s Tiefe Anlage und machen diese zu den Standard-framebuffer mit einer texturierten quad und einen einfachen pass durch fragment-shader schreibt, dass in
gl_FragDepth
. Aber das könnte langsamer sein als nur blitting es vorbei.Ich habe gerade erfahren, dass das kopieren ein depth-buffer aus einem renderbuffer der main (Kontext-zur Verfügung gestellt) depth-buffer ist höchst unzuverlässig, wenn mit glBlitFramebuffer. Nur weil Sie nicht garantieren können das format passt. Mit GL_DEPTH_COMPONENT24 als meine innere Tiefe-textur-format einfach nicht auf meinem AMD Radeon 6950 (neuste Treiber), da Windows (oder der Treiber) beschlossen, die äquivalent zu GL_DEPTH24_STENCIL8 als die Tiefe-format für meine front - /backbuffer, obwohl ich nicht Anfragen, die Schablone Präzision (stencil-bit auf 0 gesetzt, die in der pixel-format descriptor). Bei der Verwendung von GL_DEPTH24_STENCIL8 für meine framebuffer-Tiefe-textur der Blitting funktionierte wie erwartet, aber ich hatte andere Probleme mit diesem format. Der erste Versuch funktionierte gut auf NVIDIA-Karten, also ich bin mir ziemlich sicher, dass ich nicht Durcheinander zu bringen.
Was am besten funktioniert (in meiner Erfahrung) ist das kopieren via shader:
Den Fragment-Programm (aka Pixel-Shader) [GLSL]
Den C++ - code zum kopieren sieht so aus:
Ich weiß der thread ist alt, aber es war einer meiner ersten Ergebnisse beim googeln mein Problem, also möchte ich, dass es so konsistent wie möglich.
Nicht erlaubt, Bilder (Farbe oder Tiefe) der Standard-framebuffer. Ebenso können Sie nicht Bilder von den Standard-framebuffer und befestigen Sie Sie an ein FBO.