OpenGL: Texture Mapping funktioniert nicht



  • Guten Tag,

    Ich spiele ein wenig mit OpenGL rum und habe einfach nur Spaß daran ein paar Sachen mal selbst zu schreiben.

    Ich entwickel auf Ubuntu 14.04. OpenGL: 3.0 Mesa 10.5.9, GLSL: 1.30

    Mein Problem: Ich möchte eine einfache 2px x 2px Grafik (textures/test.bmp) auf Model Nr. 3 legen. Das sind also nur 4 px. zwei dieser Pixel werden auch hin und wieder korrekt angezeigt, aber nicht immer! Ich habe zuerst SOIL benutzt, um die bitmap zu laden und mich an verschiedenen Tutorials orientiert:

    http://www.opengl-tutorial.org/beginners-tutorials/tutorial-5-a-textured-cube/
    https://open.gl/textures

    Weil es nicht funktioniert hat, habe ich auch testweise eine eigene bitmap Lade-Funktion geschrieben. Hilft alles nichts. Meine Frage also: Warum wird die Textur nicht korrekt auf dem Quadrat angezeigt?

    Das ganze Projekt kann auf GitHub betrachtet werden: https://github.com/Rawocar/engine_test.git

    Wichtig sind die Funktionen: set_texture_square, create_square (en_3d_mdl.cpp) und load_bmp (en_file.cpp) Dort passiert eigentlich alles wichtige.
    Es gibt auch ein debug.htm file. Die dort genannten Funktionen werden alle korrekt ausgeführt (error handling vorhanden)
    Wer lustig ist, kann mit dem makefile sich das auch alles schnell zusammenwürfeln.

    Irgendwelche Ideen? 😕 Probiere das schon seit Tagen. Bin für jede Hilfe dankbar.



  • Was passiert wenn du eine größere Textur nimmst. Zeigt er die richtig an? Stimmen die Texturkoordinaten an den Eckpunkten? Was erhälst du, wenn du dir anstelle der Textur nur die Texturkoordinaten (Als Farbwert) anzeigen läßt?



  • Hey, vielen Dank für deine Reaktion.

    Bei einer größeren Textur wird diese einfach nur Horizontal in die Länge gezogen. Pro Reihe gibt es dann einen Pixelwert. Ich habe hier mal ein Beispiel einer größeren Originaltextur und das Ergebnis auf dem Bildschirm beigefügt.

    http://cplusplus-lernen.de/show/tiles.bmp
    http://cplusplus-lernen.de/show/screen.png (Wegen dem Winkel etwas schräg)

    Die Vertexpunkte sind wie folgt definiert:

    float size = 0.3f; (Beispiel)
    
      this->add_vertex_pos(-size, -size, size);  // links unten
      this->add_vertex_pos(-size, size, size);   // links oben
      this->add_vertex_pos(size, -size, size);   // rechts unten
      this->add_vertex_pos(size, size, size);    // rechts oben
    

    Laut OpenGL Tutorials ist beim UV Mapping:
    0,0 links unten,
    0,1 links oben,
    1,0 rechts unten
    1,1 rechts oben

    Das ist bei mir der Teil des Codes:

    pTex_Pos[0].x = 0.0f; pTex_Pos[0].y = 0.0f;
      pTex_Pos[1].x = 0.0f; pTex_Pos[1].y = 1.0f;
      pTex_Pos[2].x = 1.0f; pTex_Pos[2].y = 0.0f;
      pTex_Pos[3].x = 1.0f; pTex_Pos[3].y = 1.0f;
    

    So ist es auch im Code. Die Reihenfolge von Vertexes und Texturkoordinaten ist ebenfalls die Selbe.

    Wie ich Texturkoordinaten als Farbwert anzeigen lassen soll weiß ich nicht. Das passiert ja alles auf der GPU. Bzw. wie meinst du das?



  • Ich meine damit im Pixelshader sowas hier:

    #version 330
    
    in vec2 textcoord; //Interpolierte Texturkoordinaten
    
    void main()
    {
    
      out_frag_color = vec4(textcoord.xy,1,1);
    }
    

    Kannst du bitte noch folgendes machen:

    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge);
    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge);
    

    Ich schreibe das jetzt als C# aber in C++ sieht es fast genau so aus.



  • Habs gelöst 🙂
    Ich habe vergessen die UV Daten an die Shader zu schicken. Habe also lediglich einen weiteren VBO zur Klasse hinzugefügt, wo die Texturkoordinaten drin sind und die auch losgeschickt. klappt wunderbar! Ist auch auf GitHub hochgeladen, falls das wen interessiert.

    Vielen Dank!


Log in to reply