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

1

18.04.2014, 19:20

[SFML+OpenGl] Texturen flimmern

Hallo Leute,

ich beschäftige mich seit ein paar Tagen mit OpenGL. Bis jetzt hat auch alles ganz gut geklappt und ich habe angefangen mir eine "VoxelEngine" zu schreiben. Will da wirklich nichts großes machen, sondern nur die Grundlagen. Also lasse ich mir ein paar Würfel zeichnen. Funktioniert auch ganz gut. Aber wenn ich es jetzt mit Texturen probiere stimmt irgendetwas nicht:

(Link)

Allerdings weiß ich wirklich nicht, woher dieser Fehler kommt.
So lade ich meine Texturen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void TextureManager::addTexture(const std::string filename, const std::string key)
{
    sf::Image* texture = new sf::Image();
    if(!texture->loadFromFile(filename))
    {
        std::cout<<"ERROR: "<<filename<<" can't be loaded!"<<std::endl;
    }
    GLuint texID = 0;
    glGenTextures(1, &texID);
    std::pair<std::string, GLuint> pair;
    pair.first = key;
    pair.second = texID;
    textures.insert(pair);
    glBindTexture(GL_TEXTURE_2D, texID);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, 3,texture->getSize().x, texture->getSize().y, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture->getPixelsPtr());
    delete(texture);
}

Und so benutze ich die Textur dann zum Zeichnen:

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
void Block::render(TextureManager& textureManager)
{
    std::string key;
    switch(blocktype)
    {
    case DIRT:
        key = "dirt";
        break;
    case STONE:
        key = "stone";
        break;
    default:
        key = "dirt";
        break;
    }
    glBindTexture(GL_TEXTURE_2D, textureManager.getTexture(key));
    glBegin(GL_QUADS);
        // Front Face
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);  // Bottom Left Of The Texture and Quad
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);  // Bottom Right Of The Texture and Quad
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);  // Top Left Of The Texture and Quad
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);  // Top Right Of The Texture and Quad
        
        // Back Face
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);  // Bottom Right Of The Texture and Quad
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);  // Top Right Of The Texture and Quad
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);  // Top Left Of The Texture and Quad
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);  // Bottom Left Of The Texture and Quad
        // Top Face
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);  // Top Left Of The Texture and Quad
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);  // Bottom Left Of The Texture and Quad
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);  // Bottom Right Of The Texture and Quad
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);  // Top Right Of The Texture and Quad
        // Bottom Face
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);  // Top Right Of The Texture and Quad
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);  // Top Left Of The Texture and Quad
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);  // Bottom Left Of The Texture and Quad
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);  // Bottom Right Of The Texture and Quad
        // Right face
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);  // Bottom Right Of The Texture and Quad
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);  // Top Right Of The Texture and Quad
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);  // Top Left Of The Texture and Quad
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);  // Bottom Left Of The Texture and Quad
        // Left Face
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);  // Bottom Left Of The Texture and Quad
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);  // Bottom Right Of The Texture and Quad
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);  // Top Right Of The Texture and Quad
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);  // Top Left Of The Texture and Quad
        
    glEnd();
}


Im Internet habe ich leider keine Lösung gefunden. Und wusste auch nicht ganz genau wonach ich suchen sollte.

Ich hoffe ihr könnt mir helfen.

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

18.04.2014, 19:37

Benutzt du einen Z-Buffer? Sieht eher aus, als ob damit was nicht stimmt.

3

18.04.2014, 20:08

Ja den benutze ich eigentlich schon.
Zumindest aktiviere ich den Tiefentest am Anfang:

C-/C++-Quelltext

1
glEnable(GL_DEPTH_TEST);

Und lösche auch die entsprechenden Bits jeden Frame:

C-/C++-Quelltext

1
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

18.04.2014, 20:11

Das heißt aber nicht, dass er auch passend initialisiert wurde.
Genauso gut kann es auch sein, dass sich Faces planar überlagern. Das sieht bei der manuellen Definition der Polygone da ja kein Mensch ohne lange drüber nachzudenken. glBegin und glEnd sind übrigens furchtbar veraltet. Sollte man nicht mehr benutzen. Ist auch in den neuen GL-Versionen deprecated oder sogar gar nicht mehr verfügbar.
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]

5

18.04.2014, 20:17

Und wie sieht dann eine Alternative aus?
Hast du da vielleicht ein Tutorial oder einen Link?
Habe es bis jetzt nur so gesehen.

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

6

18.04.2014, 20:22

Muss man bei OpenGL nicht noch den Clear-Wert für den Z-Buffer angeben? Ansonsten gebe ich BlueCobold recht, es werden ziemlich sicher planare Dreiecke gezeichnet. Zeichne mal nur einen Würfel und schaue, ob es dann richtig aussieht.

7

18.04.2014, 20:26

Dieser Thread aus'm SFML-Forum könnte evtl. hilfreich sein.

MfG
Check

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

8

18.04.2014, 20:57

Die Alternative heißt OpenGL 3.3+ Core Profile.
Tutorials dazu zb.
http://www.opengl-tutorial.org/
http://www.lighthouse3d.com/tutorials/glsl-core-tutorial/
Überwiegend aktuelle Informationen findest du auch direkt auf OpenGL.org im Wiki oder bei Detailfragen in der Spezifikation.

9

18.04.2014, 21:02

Hab meinen Fehler gefunden:
Für den Würfel habe ich einfach Code aus dem Internet genommen und gar nicht darauf geachtet, dass dort jeder Vertex um ganze Einheiten verschoben wird, was zu einer Würfelgröße von 2 Einheiten führt. Bei meiner Weltberechnung rechne ich allerdings mit einer Würfelgröße von 1 Einheiten.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

18.04.2014, 22:28

Die Alternative heißt OpenGL 3.3+ Core Profile.
Kann man SFML dazu bringen ein 3.3 Core Profile zu verwenden? Eine andere Version ist aus meiner Sicht da aber nicht "die Alternative", sondern die Verwendung von entsprechenden Buffern.
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]

Werbeanzeige