OpenGL - Depth-Buffer in Textur speichern

thekiller

Viceinator
Moin moin,

ich habe im Internet schon oft Tiefenbilder gesehen wo die "nahen Pixel" hell erscheinen und die weit entfernten immer dunkler werden.

Wie hier z.B.
http://www.lastrayofhope.com/wp-content/uploads/2009/05/fbo_depthbuffer.png

Habe schon mehrere Codeschnipsel ausprobiert (unter anderen, dass unten) aber alles was bei rauskommt is ne komplett weiße Textur.

C++:
glBindTexture(GL_TEXTURE_2D, textureID);
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_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, Width, Height, 0, GL_DEPTH_COMPONENT,	GL_FLOAT, 0);

Wie funktioniert es denn richtig?

MfG Manuel
 
Zuletzt bearbeitet von einem Moderator:
Hallo Manuel,

mit deinem Codeschnipsel legst du nur eine Textur an. Den Z-Puffer kannst du z.B. so in die Textur kopieren:
C:
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, Width, Height);

Auf der Textur wirst du aber vermutlich nicht viel erkennen, dazu müsstest du die Z-Werte beispielsweise erst linearisieren.

Grüße,
Matthias
 
Mh ja da hab ich vorhin wohl bisschen gepennt beim Copy&Pasten. Da fehlt natürlich noch die Zeile die du eben nanntest.
Und ja es is nich viel zu sehn...Wie kann ich die Textur denn linearisieren? Das dürfte doch dann mit nem Shader gehn richtig?
 
Hallo Manuel,

du musst jeden z-Wert in das Kamerakoordinatensystem zurückrechnen, indem du die entsprechenden Abbildungen der Pipeline umkehrst (Projektion, Dehomogenisierung, Viewport-Transformation). Der Zusammenhang sollte im Normalfall folgender sein:

z_NDC = (f + n)/(f - n) + 2*f*n/(z_E*(f - n))
z_VP = (z_NDC + 1) / 2

Verwendete Größen:
  • n: Entfernung der Near Clipping Plane
  • f: Entfernung der Far Clipping Plane
  • z_E: z-Koordinate des Fragments in Kamerakoordinaten (zwischen -f und -n)
  • z_NDC: z-Koordinate des Fragments in normalisierten Gerätekoordinaten (zwischen -1 und 1)
  • z_VP: z-Wert in Viewport-Koordinaten (zwischen 0 und 1, das was im z-Puffer steht)

Durch einsetzen und auflösen nach z_E kommst du auf eine geschlossene Formel für die Rücktransformation. Du bekommst dann einen Wert zwischen -f und -n für z_E raus, den du dann zur Darstellung noch auf den Bereich von 0 bis 1 abbilden kannst.

Zur Anzeige der linearisierten Tiefe kannst du z.B. ein bildschirmfüllendes Primitiv rendern, im Pixelshader die Tiefenpuffertextur auslesen und die Rückrechnung durchführen.

Grüße,
Matthias
 
Zurück