OpenGL - DepthBuffer to Pixmap

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

PhillipK

Betreff: OpenGL - DepthBuffer to Pixmap

BeitragSo, Jan 13, 2013 16:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
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 Sad
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])
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, Pow2Width, Pow2Height, 0, GL_RGB, GL_INT, Null)

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0)

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 Smile (wie eine stadt im nebel *schwärm*

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 Wink

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

BeitragSo, Jan 13, 2013 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Über glReadPixels mit GL_DEPTH_COMPONENT solltest du an die aktuelle depth-komonente im render-buffer kommen.
 

PhillipK

BeitragSo, Jan 13, 2013 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
ja aber.. wie Smile
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

BeitragSo, Jan 13, 2013 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Es schreibt die Daten in den Buffer den man übergibt, in dem Format das man angefordert hat.
 

PhillipK

BeitragSo, Jan 13, 2013 22:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, und wie finde ich die größe raus? Smile
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 Sad

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group