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

MatStorm

Frischling

  • »MatStorm« ist der Autor dieses Themas

Beiträge: 14

Beruf: Student

  • Private Nachricht senden

1

27.07.2013, 22:40

[OpenGL + SDL] 2D Texturen überlappung und Transparenz

Hallo alle zusammen,

ich bin vor etwa einem halben Jahr am 2D-Spiele-Programmieren mit SDL verzweifelt (FPS unter 25, ohne groß Grafiken eingebaut zu haben). Heute habe ich wieder angefangen, doch diesmal hoffe ich mir durch OpenGL aufgrund Grafikbeschleunigung ein bisschen höhere FPS hinzukriegen ^_^
Nebenbei will ich mich dann Schritt für Schritt in Richtung 3D rantasten, was ja bei OpenGL kein Problem darstellen sollte :D
Jedoch habe ich gerade ein Problem und ich weiß nicht woran das liegt. Ich habe mir eine kleine "2D-Spiele-Engine" zusammengeschraubselt, diese macht im moment nichts weiter als einen Panzerturm ("Turm.png") und ein weißes Viereck auf den Bildschirm zu zeichnen, der Hintergrund ist rot (nur so aus Testzwecken). Um den Panzerturm herum ist ja ein transparentes Feld. Das Viereck des Turms und das weiße Viereck überlappen sich. Je nach Reihenfolge ist entweder alles richtig ("unter" dem Panzerturm ist das weiße Viereck) oder Falsch (Das weiße Viereck wird in dem Bereich, wo sich der Panzerturm befindet [Das Viereck] herausgeschnitten [rot]). Für ein besseres Verständnis (im Ausdrücken bin ich nicht gerade der Beste xD) habe ich noch 2 Screenshots hochgeladen.

So funktioniert es:

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
#include "Game.h"

void Game::RENDER()
{
    glDisable(GL_TEXTURE_2D); //Texturen deaktivieren

    glBegin(GL_QUADS); //Zeichne weißes Quadrat
        glVertex3f(110, 110, 0);
        glVertex3f(110, 220, 0);
        glVertex3f(220, 220, 0);
        glVertex3f(220, 110, 0);
    glEnd();

    glEnable(GL_TEXTURE_2D); //Texturen aktivieren
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //Tranzparenzoptionen
    glEnable(GL_BLEND); //Transparenz aktivieren

    map<string, unsigned int>::iterator i = textures.find("Turm.png"); //hole "Turm.png"
    glBindTexture(GL_TEXTURE_2D, i->second); //Aktiviere Turm.png

    glBegin(GL_QUADS); //Zeichne Turm
        glTexCoord2f(0, 0); glVertex3f(60, 60, 1);
        glTexCoord2f(0, 1); glVertex3f(60, 170, 1);
        glTexCoord2f(1, 1); glVertex3f(170, 170, 1);
        glTexCoord2f(1, 0); glVertex3f(170, 60, 1);
    glEnd();
}


So funktioniert es NICHT:

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
#include "Game.h"

void Game::RENDER()
{
    glEnable(GL_TEXTURE_2D); //Texturen aktivieren
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //Tranzparenzoptionen
    glEnable(GL_BLEND); //Transparenz aktivieren

    map<string, unsigned int>::iterator i = textures.find("Turm.png"); //hole "Turm.png"
    glBindTexture(GL_TEXTURE_2D, i->second); //Aktiviere Turm.png

    glBegin(GL_QUADS); //Zeichne Turm
        glTexCoord2f(0, 0); glVertex3f(60, 60, 1);
        glTexCoord2f(0, 1); glVertex3f(60, 170, 1);
        glTexCoord2f(1, 1); glVertex3f(170, 170, 1);
        glTexCoord2f(1, 0); glVertex3f(170, 60, 1);
    glEnd();
    
    //HIER WURDEN DIE "OBJEKTE" VERTAUSCHT
    
    glDisable(GL_TEXTURE_2D); //Texturen deaktivieren

    glBegin(GL_QUADS); //Zeichne weißes Quadrat
        glVertex3f(110, 110, 0);
        glVertex3f(110, 220, 0);
        glVertex3f(220, 220, 0);
        glVertex3f(220, 110, 0);
    glEnd();
}


Kann mir vielleicht jemand Erklären, was hier der Fehler ist? :S
Ich bedanke mich im Voraus ^_^

Mit freundlichen Grüßen,
MatStorm

PS: Ja ich weiß, der Code is noch "bisschen" unordentlich, ich werde sobald ich OpenGL richtig kennen gelernt habe die "Engine" intelligenter aufbauen xD
»MatStorm« hat folgende Bilder angehängt:
  • Bildschirmfoto vom 2013-07-27 22:38:25.png
  • Bildschirmfoto vom 2013-07-27 22:38:49.png

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

28.07.2013, 10:10

Des Rätsels Lösung nennt sich Z-Buffering. Das Verursacht dieses Verhalten. Render-Reihenfolgen sind wichtig. Die Z-Koordinate und nur für den Z-Buffer interessant, ändert aber an der Reihenfolge des Zeichnens nichts. Lege ich ein rotes Blatt Papier über ein Blaues, ist das rote eben oben. Mache ich es andersherum, ist eben das blaue oben. Dasselbe passiert, wenn ich erst das blaue hinlegen und das rote darunter schiebe. Da ist trotzdem das blaue oben.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

MatStorm

Frischling

  • »MatStorm« ist der Autor dieses Themas

Beiträge: 14

Beruf: Student

  • Private Nachricht senden

3

28.07.2013, 11:59

Den Z-Buffer habe ich bei der Initialisierung des Spiels mit

C-/C++-Quelltext

1
glEnable( GL_DEPTH_TEST );


aktiviert. Oder ist dem nicht so? Muss ich noch etwas machen?
Hier mal den Code der Initialisierungsfunktion:

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
bool Game::Init(int width, int height, int depth, bool fullscreen)
{
    if( SDL_Init( SDL_INIT_EVERYTHING ) != 0 ) return false;

    SDL_WM_SetCaption("GAME" , NULL );
    SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );

    surface = SDL_SetVideoMode(width, height, depth, SDL_OPENGL | ( fullscreen ? SDL_FULLSCREEN : 0 ) );
    if( !surface ) return false;

    glClearColor( 1, 0, 0, 1 ); // Farbe zum Löschen setzen
    glEnable( GL_DEPTH_TEST );      // Z-Buffer und Tiefentest aktivieren

    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho( 0, width, height, 0, -1, 1 );

    /*if(!LoadTexture("Wanne.png"))
    {
        return false;
    }*/
    if(!LoadTexture("Turm.png"))
    {
        return false;
    }

    return true;
}

void Game::Run()
{
    bool run = true;
    SDL_Event event;

    //GAMESTART();
    while(run)
    {
        //Eventschleife
        while( SDL_PollEvent(&event))
        {
            switch(event.type)
            {
            case SDL_KEYDOWN:
                {
                    if( event.key.keysym.sym == SDLK_ESCAPE ) run = false;
                } break;
            case SDL_QUIT:
                {
                    run = false;
                } break;
            }
        }//#Eventschleife
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
        LOGIC();
        RENDER();
        SDL_GL_SwapBuffers();
    }
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

28.07.2013, 12:55

Lies meinen letzten Beitrag noch einmal.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

MatStorm

Frischling

  • »MatStorm« ist der Autor dieses Themas

Beiträge: 14

Beruf: Student

  • Private Nachricht senden

5

28.07.2013, 16:13

Ah also habe ich das richtig verstanden: selbst mit eingeschaltetem Z-Buffer ist die Reihenfolge, in der die Objekte gerendert werden, wichtig, weshalb ich dann die Objekte sortieren muss, bevor ich sie rendere?
Ist der Sinn des Z-Buffers nicht der, dass die Grafikkarte anhand der Z-Koordinaten bestimmt, welches Objekt zuerst gerendert wird? Da ich ja bei beiden Objekten verschiedene Z-Koordinaten habe.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

28.07.2013, 16:16

Der erste Satz stimmt.
Der zweite eben nicht. Der Sinn des Z-Buffers ist zu entscheiden welche Pixel welcher Objekte näher an der Kamera sind und NUR die vordersten Pixel im Endergebnis stehen zu haben. Mit Sortierung hat es rein gar nichts zu tun. Daher ist es auch total egal, welche Reihenfolge Du benutzt, sondern wichtig sind die Z-Koordinaten.
Wenn Du so ein Verhalten nicht willst, dann schalte den Z-Buffer aus und sortiere selbst. Weder Grafikkarte, noch Z-Buffer sind irgendwelche Sortiermaschinen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

MatStorm

Frischling

  • »MatStorm« ist der Autor dieses Themas

Beiträge: 14

Beruf: Student

  • Private Nachricht senden

7

28.07.2013, 20:06

Gut, danke für die Antwort^^
Denke, dass ich es jetzt verstanden habe. ^^

Werbeanzeige