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

11.01.2011, 19:19

OpenGL: CubeMap RenderTargets

Hi,
wie ihr unschwer erkennen könnt, arbeite ich gerade viel mit RenderTargets ^^. In D3D9 funktionieren die CubeMap render targets schon, aber in OpenGL noch nicht.
Ich habe auch einmal hier nachgesehen, es scheint aber so,
als wäre bei mir alles korrekt mit OpenGL erstellt und konfiguriert worden.
Aber leider wird nichts in die Texture gerendert :( aber beim Erstellen des RenderTargets (bzw. FrameBufferObjects) meldet OpenGL keinen Fehler (glCheckFramebufferStatusEXT).
Ich bin sicher an den Richtigen Stellen statt GL_TEXTURE_2D GL_TEXTURE_CUBMAP oder eben GL_TEXTURE_CUBEMAP_POSITION_X ... verwendet zu haben.
Bsp:

C-/C++-Quelltext

1
2
3
4
5
6
7
// Für 2D Texturen
glBindTexture(GL_TEXTURE_2D, TexID);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, TexID, 0);

// Für CubeMap Texturen
glBindTexture(GL_TEXTURE_CUBE_MAP, TexID);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_CUBE_MAP_POSITIVE_X + CubeMapFace, TexID, 0);

Woran kann es liegen, dass da trotzdem nichts rein gerendert wird? Bei einfachen 2D Texturen funktioniert das wunderbar.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

11.01.2011, 19:43

Hast du für deine CubeMap beim Erstellen schon den Texturfilter gesetzt (glTexParameteri)? Das vergisst man gern mal und in OpenGL geht ohne aber nix...

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

11.01.2011, 19:59

jaja, das macht meien Engine schon alles automatisch. Auch mit dem richtigen Target Typ (GL_TEXTURE_CUBEMAP).

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

4

12.01.2011, 15:48

Also ich hab jetzt zu mindest schon mal folgendes heraus gefunden:

C-/C++-Quelltext

1
2
3
4
5
// Bei 2D Texturen:
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, TexID, 0); // Alles ok

// Bei CubeMaps:
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_CUBE_MAP_POSITIVE_X, TexID, 0); // Fehler: Missing attachment in FrameBufferObject (GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT)


Wenn ich als Texture-Target "GL_TEXTURE_CUBE_MAP_POSITIVE_X" angebe wirft mir die Funktion glCheckFramebufferStatusEXT den Fehler GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT aus.
Aber in dem Tutorials, die ich bisher gesehen habe, steht, dass man da nicht GL_TEXTURE_CUBE_MAP, sondern eben die Face-side angeben muss.
Woran kann das also liegen, dass ich diese Fehlermeldung bekomme??
Mit glFramebufferTextureFaceEXT hab ich's auch schon probiert, funktioniert aber auch nicht. Und wenn ich eine CubeMap manuell erstelle geht's. Und mit glCopyTexImage2D kann ich auch eine dynamic-cubemap erstellen. Nur mit FBOs nicht :(

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

5

12.01.2011, 16:17

Sollte das setzen nicht so funktionieren:

C-/C++-Quelltext

1
2
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FboID);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_CUBE_MAP_POSITIVE_X + CubeMapFace, TexID, 0);


anstatt wie du es hast:

C-/C++-Quelltext

1
2
glBindTexture(GL_TEXTURE_CUBE_MAP, TexID);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_CUBE_MAP_POSITIVE_X + CubeMapFace, TexID, 0);


Immerhin willst du ein RenderTarget als Ziel setzen und keine Textur als Quelltextur.

mfg Mark

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

12.01.2011, 16:24

Es muss natürlich beides gebunden sein, Framebuffer und Texture, ich ging davon aus dass das der Fall ist, aber klar, wenn nicht dann erklärt das den Fehler ^^

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

7

12.01.2011, 16:34

Nein, das ist leider nicht das Problem. Der Code oben sollte nur zeigen, dass ich auch bei glBindTexture wirklich GL_TEXTURE_2D bei 2D Texturen und GL_TEXTURE_CUBE_MAP bei CubeMaps verwende.
Bei 2D Texturen funktionieren die FBOs ja wunder bar. Hier ist der ganze Code, falls der euch weiter hilft:

C-/C++-Quelltext

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/* ... */

// Texture konfigurieren:

GLDimension_ = GL_TEXTURE_CUBE_MAP;
CubeMapFace_ = 0;
Size_.Width = 256;
Size_.Height = 256 * 6; // Der ImageBuffer ist auch bei CubeMaps als 2D Texture gespeichert, aber der interessiert bei FBOs ja eh nicht.
Depth_ = 6;
isRenderTarget_ = true;

// Cubemap erstellen:

glGenTextures(1, &OrigID_);
glBindTexture(GLDimension_, OrigID_);

            for (s32 i = 0; i < 6; ++i)
            {
                glTexImage2D(
                    GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB8, Size_.Width, Size.Height / Depth_, 0, GLFormat, GL_UNSIGNED_BYTE, 0
                );
            }


/* ... */

// FBO erstellen:

    if (isRenderTarget_)
    {
        glGenFramebuffersEXT(1, &FrameBufferID_);
        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FrameBufferID_);
        
        if (Format_ == PIXELFORMAT_DEPTH)
        {
            glDrawBuffer(GL_NONE);
            
            glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GLDimension_, OrigID_, 0);
        }
        else
        {
            /* Bind texture */
            glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
            
            if (DimensionType_ == TEXTURE_CUBEMAP)
                glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_CUBE_MAP_POSITIVE_X + CubeMapFace_, OrigID_, 0);
            else
                glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GLDimension_, OrigID_, 0);
            
            checkFrameBufferErrors(); // Hier kommt: GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT und das darf nicht passieren. Bei 2D Texturen tritt das nicht auf.
            
            /* Bind depth buffer */
            glGenRenderbuffersEXT(1, &DepthBufferID_);
            glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, DepthBufferID_);
            
            glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, Size_.Width, Size_.Height / Depth_);
            glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, DepthBufferID_);
        }
        
        checkFrameBufferErrors();
        
        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
        glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
    }

/* ... */

// Zum Einstellen, in welche CubeMap-Face gerade gerendert werden soll:

    CubeMapFace_ = Face;
    
        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FrameBufferID_);
        glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_CUBE_MAP_POSITIVE_X + CubeMapFace_, OrigID_, 0);
        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

/* ... */

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

8

12.01.2011, 16:57

Auf die Schnelle sehe ich nichts falsches an deinem Code, lade dir doch mal dieses nützliche Tool: http://www.gremedy.com/ (gDEBugger) und schaue was es dir an Informationen liefert.

Hast du mal versucht ein minimal Code zu erstellen? Irgendwo muss ja der Fehler sein, vermutlich nur etwas wirklich kleines unscheinbares.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

12.01.2011, 16:59

Das find ich irgendwie seltsam:

C-/C++-Quelltext

1
2
            /* Bind texture */
            glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);

Is die Texture da ganz sicher gebunden?
Wofür die glDrawBuffer() Geschichte?

Abgesehen davon hoff ich dass du da auch hier deine Texture vorher schon gebunden hast:

C-/C++-Quelltext

1
2
3
4
5
6
7
// Zum Einstellen, in welche CubeMap-Face gerade gerendert werden soll:

    CubeMapFace_ = Face;
    
        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, FrameBufferID_);
        glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_CUBE_MAP_POSITIVE_X + CubeMapFace_, OrigID_, 0);
        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

10

12.01.2011, 18:20

Ahhhhh, perfekt :D Ich hab den Fehler mit Hilfe des Programms "gDEBugger" gefunden. Danke Mark (oder "DerMark" ^^).
Ich hab in mit meiner Engine zwar den ImageBuffer aktuallisiert aber nicht von einer standard 2D Texture zu einer CubeMap konvertiert. D.h. ich hab für die 6 Seiten immer nur GL_TEXTURE_2D and statt die Cubemap version verwendet.
Is immer etwas schwer bei so großen Programmen den Überblick zu behalten, aber das Debug Programm ist für OpenGL Entwicklung wirklich sehr zu empfehlen :)

Werbeanzeige