OpenGL - DepthBuffer to Pixmap
Übersicht

PhillipKBetreff: OpenGL - DepthBuffer to Pixmap |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Huhu Blitzforum!
Ich bin mal wieder an einer bescheuerten Frage bei. Ich versuche grade verzweifelt, die Tiefencomponente meines Backbuffers in für mich lesbare werte umzuwandeln. Im idealfall sogar als pixmap, das ich mir das ding speichern kann. Warum? Ganz einfach: Ich muss wissen,wie der aussieht ![]() Geplant ist das ganze, um *eventuell* ein 3d Licht in meine Szene einzubauen. Hierzu habe ich diverse überlegungen angestellt, eine geht über den aktuellen Depthbuffer + Depthtest. Nun versuche ich, um mir überhaupt ein bild zu machen und ein wenig auf dem Papier zu skizzieren einene Depthbuffer als Bild abzupacken. Im idealfall läuft es wie folgt ab: Zieltextur binden und den Backbuffer und seine DepthComponents kopieren. Zieltextur auslesen und als pixmap speichern ODER Zieltextur rendern. Leider klappt nichts was ich hier teste - entweder erhalte ich ein Weißes bild, eine schwarze pixmap oder einen runtimeerror in den entsprechenden zeilen, wo ich kopiere ![]() Mein problem ist vorallem, das ich nicht nachvollziehen kann, welche Formate und Typen etc gefordert sind. Auch ewig viele googleergebnisse haben nicht geholfen. Den umweg, ein FBO mit aktivierter textur mit tiefenanteil zu binden, danach die gesamte szene erneut zu rendern möchte ich vermeiden. Hier mein code, wie ich eine textur erstelle: BlitzMax: [AUSKLAPPEN] glBindTexture(GL_TEXTURE_2D, _tex[i]) Hier habe ich mit GL_DEPTH_COMPONENT24 gespielt, ebenso diverse möglichkeiten bei GL_RGB eingetragen und auch GL_INT öfters ausgetauscht. Zum übertragen habe ich die befehle glCopyTexImage2D in diversen variationen ausgetestet, ebenso glCopyTexSubImage2D (diverse variationen) und auch eine Pixmap erstellt (diverse typen, yay!) und mit glReadPixels (und ratet mal.. diverse variationen!) versucht, die daten in einen Pointer auf pixel 0,0 der pixmap zu kopieren und dieses zu speichern. Ende vom lied ist, das ich solangsam glaube, das mein vorhaben utopisch ist und opengl einfach garnicht zulässt. Irgendwelche ideen? Hat eventuell schonmal jemand versucht, etwas ähnliches in C++ oder blitzmax zu machen? :3 Edit: Aufgrund von frust habe ich es kurzerhand über einen shader gelöst. Sieht gut aus ![]() Hier die beiden shader, falls intresse besteht: Vertexshader: Code: [AUSKLAPPEN] void main( void ) {
gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex; gl_TexCoord[ 0 ] = gl_MultiTexCoord0; } Fragmentshader: Code: [AUSKLAPPEN] void main( void ) {
gl_FragColor = vec4(gl_FragCoord.z, gl_FragCoord.z, gl_FragCoord.z, 1.0);; } So wenig code und doch so ein krasses ergebnis, cool ![]() Ps: Eine möglichkeit, den Depthbuffer ordnungsgemäß zu kopieren und darzustellen suche ich immernoch. Ich möchte wie erwähnt - Ungerne - meine szene 2x rendern ^^ |
||
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Über glReadPixels mit GL_DEPTH_COMPONENT solltest du an die aktuelle depth-komonente im render-buffer kommen. | ||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ja aber.. wie ![]() Die funktion haut entweder nicht hin oder zeigt kein ergebniss. Ich verstehe die parameter nicht so ganz, welches bezieht sich auf was und wie darf ich sie interpretieren? :O |
||
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es schreibt die Daten in den Buffer den man übergibt, in dem Format das man angefordert hat. | ||
PhillipK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Okay, und wie finde ich die größe raus? ![]() Muss ich zb die PowerOfTwo werte von Graphicswidth() und GraphicsHeight() nehmen oder direkt die beiden als größe ? Mein plan ist, das format passend zu einer pixmap zu wählen. Sprich als beispiel RGB und als depthcomponente Dingens24 (klingt nach 24 bit -> 3 byte -> RGB) Die pixmap kriegt die entsprechende größe und als Buffer nehm ich den Pix.PixelPtr(0,0) pointer. Soweit die theorie, jetzt test ich wiedereinmal die praxis ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group