Ich habe einen Renderbuffer (DepthStencil) in einem FBO und muss eine Textur daraus erhalten. Es scheint, dass ich im FBO nicht sowohl eine DepthComponent-Textur als auch einen DepthStencil-Renderbuffer haben kann. Ich brauche also eine Möglichkeit, den Renderbuffer in eine DepthComponent-Textur umzuwandeln, nachdem ich ihn für die spätere Verwendung in der Pipeline fertiggestellt habe.
Ich habe wochenlang viele Techniken ausprobiert, um die Tiefenkomponente aus dem Renderbuffer zu holen, aber ich komme immer mit Junk raus. Alles, was ich am Ende möchte, ist die gleiche Textur, die ich von einem FBO erhalten würde, wenn ich keinen Renderbuffer verwenden würde. Kann jemand eine umfassende Anleitung oder einen Code veröffentlichen, der diese scheinbar einfache Operation behandelt?
BEARBEITEN:
Link zu einer Extraktversion des Codes http://dl.dropbox.com/u/9279501/fbo.cs
Screeny des Tiefenschärfeeffekts + FBO - ohne Tiefenschärfe (!) Http://i.stack.imgur.com/Hj9Oe.jpg
Screeny ohne Schärfentiefeeffekt + FBO - Schärfentiefe funktioniert einwandfrei http://i.stack.imgur.com/boOm1.jpg
Was Sie fragen, ist in OpenGL 3.2 möglich. Mein FBO spuckt diffuse Farbe auf eine Farbtextur aus, Normalen auf eine andere Farbtextur und Tiefe auf eine Tiefentextur - es werden keine Renderbuffer benötigt. Tatsächlich stellen Renderbuffer nur ein Problem dar, da Sie keine Samples daraus erstellen können. Sie müssten also
glReadPixels(...)
die Daten aus dem RBO in eine Textur auf der CPU kopieren oder anderweitig verwenden, anstatt nur alles im GPU-Speicher zu behalten. So...Wenn Sie wirklich wollen, können Sie Code in Ihren First-Pass-Shader schreiben, um Inhalte wie die Tiefe manuell in einem separaten Farbtextur-Anhang in Ihrem FBO auszugeben. Das wäre für Sie in Ihren Post-Pass-Shadern von Nutzen . Für die Verwendung von OpenGL beim internen Tiefentest benötigen Sie zusätzlich entweder einen RBO oder ein Textur-Set als GL_DEPTH_ATTACHMENT Ihres FBO. Sie können jedoch eine einzige Textur einrichten, um beide zu bedienen - dies ist effizienter und einfacher zu handhaben.
Mein Setup-Code für die Tiefenstruktur sieht folgendermaßen aus (Java, ignoriere einfach das ByteBuffer-Zeug ... und beachte, dass ich "id" verwende, um auf ganzzahlige Handles / Zeiger zu verweisen, da dieses Konzept in Java nicht wirklich gut funktioniert):
Und später:
Sie können jetzt
gBufferDepthTexture
(oder was haben Sie) als Uniform an Ihre Fragment-Shader des zweiten und dritten Durchgangs übergeben. Ich denke, wir können davon ausgehen, dass Sie mit dem Schablonenpuffer genau dasselbe tun können.quelle
Sie sollten in der Lage sein, eine Textur (anstelle eines RenderBuffers) im Format GL_DEPTH_STENCIL zu erstellen. Ich bin mir nicht sicher, wie genau die Tiefe einer solchen Textur in einem Shader-Programm verwendet werden soll (was Sie vermutlich verwenden, da Sie FBOs verwenden), aber in der OpenGL-Spezifikation sollte angegeben werden, welche Farbkanäle welche Werte erhalten ( Ich schätze, dass R, G und B alle auf Tiefe und A auf Schablone gesetzt werden.
Ich arbeite derzeit mit OpenGL 3.2, daher müssen Sie möglicherweise überprüfen, ob das Texturformat für Sie geeignet ist. Ich kann mich nie erinnern, welche Versionen unterschiedliche Funktionen bieten.
quelle