Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

05.04.2010, 20:00

OpenGL: FrameBufferObjects mit Depth-Textures

Kann mir vlt. jemand erklären, wie man mit FBOs in OpenGL Depth-Textures erstellen kann?

Ich will also quasi mit FBOs sowas rendern:

(Link)


So sieht mein Code in etwa aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*
FrameBufferID & DepthBufferID sind die IDs für das FBO
TextureMainID ist die ID für die Texture selbst
TextureWidth & TextureHeight beschreiben die Texture Größe
ImageData sind die (unsigned char*) Pixel Puffer Daten
*/

// Set texture parameters
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

// Create the texture
glGenTextures(1, &TextureMainID);
glBindTexture(GL_TEXTURE_2D, TextureMainID);

GLuint GLFormat = GL_DEPTH_COMPONENT;
GLuint GLInternalFormat = GL_DEPTH_COMPONENT; // or 1. Both should be possible.
glTexImage2D(GL_TEXTURE_2D, 0, GLInternalFormat, TextureWidth, TextureHeight, 0, GLFormat, GL_UNSIGNED_BYTE, ImageData);

// Create the FBO
glGenFramebuffersEXT(1, &FrameBufferID);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FrameBufferID);

glGenRenderbuffersEXT(1, &DepthBufferID);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, DepthBufferID);

glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, TextureWidth, TextureHeight);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, DepthBufferID); 

glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, TextureMainID, 0);

// Check for errors while creating the FBO ...


Kann mir jemand sagen was mir fehlt? Was ich falsch mache? Wie das am besten geht?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

05.04.2010, 20:16

Die Depthtexture mit DEPTH_ATTACHMENT_EXT Attachment-Parameter anfügen?
@D13_Dreinig

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

05.04.2010, 20:35

"Incomplete attachment in FrameBufferObject!" ist der Fehler Code wenn ich folgendes schreibe:

Quellcode

1
2
3
4
5
6
7
/*
Ursprünglich:
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, ID_, 0);
*/

//Neu - aber falsch:
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, ID_, 0);

ernest7

Frischling

Beiträge: 20

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

4

05.04.2010, 22:33

Ich hab das vor Ewigkeiten mal hinbekommen, allerdings gleich in Verbindung mit nem Stencil-Buffer. Leider sagt mir dass jetzt selbst nicht mehr so viel, aber vielleicht bringts dir was (hab das bisher auch nur auf Nvidiakarten laufen gehabt):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 // Create depth-and-stencil-renderbuffer
glGenRenderbuffersEXT(1, &rbDepthandStencil);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rbDepthandStencil);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH24_STENCIL8_EXT, windowwidth, windowheight);


//FBO1
glGenFramebuffersEXT(1, &fbo1);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo1);

//attach color-texture to FBO1
...

//Attach depth-and-stencil-renderbuffer to FBO1
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rbDepthandStencil);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rbDepthandStencil);
*Werbung* Der Welt bestes Android-Metronom: Metronomerous *Werbung*

5

06.04.2010, 01:01

Das Problem ist, dass du den Depthbuffer als Renderbuffer, und nicht als Depth Texture anhängst, du willst doch auf die Tiefenwerte nachher auch zugreifen oder nicht? Dann musst du eine Depth Texture erstellen (Anmerkung: In deiner ersten Antwort hier sieht es aus, als ob du eine normale Textur als DEPTH_ATTACHMENT anhängen möchtest!), wie das geht sollte klar sein, und diese folgendermaßen an dein FBO hängen:

Quellcode

1
2
3
4
5
6
7
    public void addTexture(DepthTexture texture) {
        
        bind();
        glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, texture.getHandle(), 0);
        
        textures ~= texture;
    }


Wenn ich es richtig in Erinnerung hab, reicht es wenn du an dein FBO _nur_ die Tiefentextur hängst, dass ist am wenigsten Fehleranfällig - zumindest soweit dich sowieso nur die Tiefenwerte interessieren.

Alternativ funktioniert es natürlich auch mit Renderbuffern, damit hast du den Vorteil, dass du auch Multisampled in dein FBO rendern kannst, allerdings kommst du dann nicht so leicht an die Tiefenwerte, wie auch immer, wenn du ein Renderbuffer Objekt erstellt hast sähe der Code so aus:

Quellcode

1
2
3
4
5
    public void addRenderBuffer(DepthRenderBuffer renderBuffer) {
        
        bind();
        glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, renderBuffer.getHandle());
    }


Viele Grüße!

Werbeanzeige