C/OpenGL : geladenes Bild erscheint nur blau.



  • inter2k3 schrieb:

    Ich weiss ja nicht wie du die Bilddaten gespeichert hast.
    Ich vermute, dass du für jeden Kanal (R,G,B und auch alpha) einzelne Werte aus dem TGA gelesen und gespeichert hast, und dann wäre die Angabe von GL_LUMINANCE eben nicht richtig.

    Hast du vlt. glEnable(GL_TEXTURE_2D) vergessen?

    Danke für deine Geduld 🙂

    glEnable(GL_TEXTURE_2D) klappt nicht.

    Ich habe die Daten in Paint.NET als 32 Bit TGA unkomprimiert gespeichert.

    Welche Einstellung wäre deiner Meinung nach richtig?

    Danke



  • anfaenger01 schrieb:

    Danke für deine Geduld 🙂

    glEnable(GL_TEXTURE_2D) klappt nicht.

    Was meinst du mit klappt nicht - das musst du ohnehin im code stehen haben.

    anfaenger01 schrieb:

    Ich habe die Daten in Paint.NET als 32 Bit TGA unkomprimiert gespeichert.
    Welche Einstellung wäre deiner Meinung nach richtig?
    Danke

    Wie gesagt weiss ich ja nicht, wie dein TGA-Loader die Daten einliest und wie du sie speicherst, aber ich würde aus dem Bauch herraus einfach mal GL_RGBA oder GL_BGRA tippen.

    Nachtrag: Was is vergessen hab zu erwähnen - du solltest noch einen minification- und einen magnificatoin-Filter mit für die Textur setzen:

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    


  • inter2k3 schrieb:

    Was meinst du mit klappt nicht - das musst du ohnehin im code stehen haben.

    Dieser State wurde schon vorher gesetzt. Wenn ich ihn kurz vor dem GL_QUADS state einfüge ändert es nichts am Zustand.

    anfaenger01 schrieb:

    Wie gesagt weiss ich ja nicht, wie dein TGA-Loader die Daten einliest und wie du sie speicherst, aber ich würde aus dem Bauch herraus einfach mal GL_RGBA oder GL_BGRA tippen.

    Im bestehenden Code werden die Texturen fast genau so geladen wie ich es jetzt versuche. Ich vermute es liegt nicht am image loader oder Anordnung.

    anfaenger01 schrieb:

    Nachtrag: Was is vergessen hab zu erwähnen - du solltest noch einen minification- und einen magnificatoin-Filter mit für die Textur setzen:

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    

    Brachte auch keinen Effekt.

    Es sieht so aus: http://img705.imageshack.us/img705/2148/opengltga.jpg
    Ich habe versucht glColor4f(0.0,0.0,0.0,1.0);
    Dann wird das Kästchen schwarz



  • Jetzt habe ich einen anderen Aufruf gefunden der funktioniert, allerdings ohne Alpha Kanal

    glTexImage2D(GL_TEXTURE_2D,0,3,16,16,0,GL_RGB,GL_UNSIGNED_BYTE,crossSprite[i].img.GetData());
    

    Wenn ich es nun in RGBA ändere dann gibt es Grafikfehler.



  • Woher genau kommt der Inhalt von crossSprite[i].img.GetData()!? Als internalFormat würd ich immer ein exaktes Format angeben, in dem Fall wär das GL_RGBA8 oder GL_BGRA8...



  • dot schrieb:

    Als internalFormat würd ich immer ein exaktes Format angeben, in dem Fall wär das GL_RGBA8 oder GL_BGRA8...

    Also:

    glTexImage2D(GL_TEXTURE_2D,0,3,16,16,0,GL_RGBA8,GL_UNSIGNED_BYTE,crossSprite[i].img.GetData());
    

    Funktioniert auch nicht

    dot schrieb:

    Woher genau kommt der Inhalt von crossSprite[i].img.GetData()!?

    Das ist eine wxWidgets Funktion:
    http://docs.wxwidgets.org/trunk/classwx_image.html#5cac38e8fd2536852406d9c8daa55023

    und der Datensatz:

    static const unsigned char spriteredcross[] = {
    0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x08, 0x86, 0x00, 
    0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0xFF, 0x86, 0x00, 
    0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 
    0x00, 0xFF, 0xFF, 0x86, 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 
    0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0xFF, 0x86, 0x00, 
    0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 
    0x00, 0xFF, 0xFF, 0x86, 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 
    0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0xFF, 0x86, 0x00, 
    0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 
    0x00, 0xFF, 0xFF, 0x86, 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 
    0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0xFF, 0x86, 0x00, 
    0x00, 0x00, 0x00, 0x8F, 0x00, 0x00, 0xFF, 0xFF, 0x8F, 0x00, 
    0x00, 0xFF, 0xFF, 0x86, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 
    0x00, 0xFF, 0xFF, 0x86, 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 
    0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0xFF, 0x86, 0x00, 
    0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 
    0x00, 0xFF, 0xFF, 0x86, 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 
    0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0xFF, 0x86, 0x00, 
    0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 
    0x00, 0xFF, 0xFF, 0x86, 0x00, 0x00, 0x00, 0x00, 0x86, 0x00, 
    0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0xFF, 0xFF, 0x86, 0x00, 
    0x00, 0x00, 0x00, 0x86, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 
    0x00, 0xFF, 0xFF, 0x86, 0x00, 0x00, 0x00, 0x00
    };
    


  • anfaenger01 schrieb:

    dot schrieb:

    Als internalFormat würd ich immer ein exaktes Format angeben, in dem Fall wär das GL_RGBA8 oder GL_BGRA8...

    Also:

    glTexImage2D(GL_TEXTURE_2D,0,3,16,16,0,GL_RGBA8,GL_UNSIGNED_BYTE,crossSprite[i].img.GetData());
    

    Funktioniert auch nicht

    internalFormat ist der dritte Parameter und nicht der siebente 😉
    Also:

    glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,16,16,0,GL_RGBA,GL_UNSIGNED_BYTE,crossSprite[i].img.GetData());
    

    Wenn ich mir deine Daten so anschau zähl ich (25 - 1) * 10 - 2 = 238 Bytes. Das ist kein Vielfaches von 4, was mich zu dem Schluss führt dass die Daten in diesem Array da keinen Akphakanal enthalten. Irgendwas is da aber sowieso komisch, wie kann das Bild 16x16 Pixel groß sein wenn es nur 238 Bytes hat!?



  • dot schrieb:

    internalFormat ist der dritte Parameter und nicht der siebente 😉

    Wärst du so freundlich zu sagen wie die Zeile lauten muss? Ich verstehe gerade den Unterschied zwischen internalFormat und format nicht?

    dot schrieb:

    Wenn ich mir deine Daten so anschau zähl ich (25 - 1) * 10 - 2 = 238 Bytes. Das ist kein Vielfaches von 4, was mich zu dem Schluss führt dass die Daten in diesem Array da keinen Akphakanal enthalten. Irgendwas is da aber sowieso komisch, wie kann das Bild 16x16 Pixel groß sein wenn es nur 238 Bytes hat!?

    Ups, ist wahrscheinlich komprimiert gewesen:

    static const unsigned char spriteredcross[] = {
    0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x20, 0x08, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 
    0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 
    0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 
    0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 
    0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 
    0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 
    0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 
    0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 
    0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 
    0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 
    0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 
    0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 
    0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 
    0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 
    0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 
    0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 
    0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 
    0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 
    0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 
    0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00
    };
    


  • anfaenger01 schrieb:

    dot schrieb:

    internalFormat ist der dritte Parameter und nicht der siebente 😉

    Wärst du so freundlich zu sagen wie die Zeile lauten muss? Ich verstehe gerade den Unterschied zwischen internalFormat und format nicht?

    hab ich doch oben eh hingeschrieben^^

    internalFormat ist das Format in dem die Textur auf der Grafikkarte abgelegt werden soll. Das andere format ist das Format in dem die Daten die du an glTexImage2D() übergibst vorliegen.

    anfaenger01 schrieb:

    Ups, ist wahrscheinlich komprimiert gewesen:

    Jetzt zähl ich 1042 Byte, sollten aber 1024 sein, kanns sein dass da noch irgendwelche Headerdaten mit drin sind (der TGA Header wär nämlich genau 18 Byte groß)!?



  • dot schrieb:

    Jetzt zähl ich 1042 Byte, sollten aber 1024 sein, kanns sein dass da noch irgendwelche Headerdaten mit drin sind!?

    Gehören Header Daten nicht rein?



  • anfaenger01 schrieb:

    dot schrieb:

    Jetzt zähl ich 1042 Byte, sollten aber 1024 sein, kanns sein dass da noch irgendwelche Headerdaten mit drin sind!?

    Gehören Header Daten nicht rein?

    Um, nein, was sollte die Funktion denn damit anfangen!?



  • dot schrieb:

    Um, nein, was sollte die Funktion denn damit anfangen!?

    Wundert mich weil man an einer anderen stelle dieselbe Funktion verwendet und es einwandfrei funktioniert.

    Die Zeilen sehen so aus:

    glBindTexture  (GL_TEXTURE_2D, tm->textures[index++]);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,     GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,	  GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    
    glTexImage2D   (GL_TEXTURE_2D,0,GL_RGB,size,size,0,GL_LUMINANCE, GL_UNSIGNED_BYTE,tmp);
    


  • Muss mich korrigieren. Die wxWidgets funktion gibt ja alles unkomprimiert und ohne header aus. Wenn ich die von dir genannte Zeile verwende wird das nichts 😞 Ich bekomme Renderfehler.



  • Ok, vielleicht braucht dein wxWidgets Image Ding da die Headerdaten, das kann ich dir nicht sagen. glTexImage2D() jedenfalls fangt damit nix an, das will einfach nur ein rohes Array aus Farbwerten.

    Warum hast du jetzt wieder die alte Zeile mit GL_LUMINANCE, ich dachte es wurde schon gesagt dass das Blödsinn ist!? Was ist tmp!?

    EDIT: Zeig mal bitte ein Bild wie diese "Renderfehler aussehen"...



  • Ich denke dass ich (meinen) Fehler gefunden habe. wxWidgets gibt RGBRGBRGB zurück. Da fehlt der Alpha Kanal.



  • Dann lass das wxImage mal, nimm die ersten 18 Byte aus deinem spriteredcross Array und mach einfach folgendes:

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteredcross);
    


  • dot schrieb:

    Dann lass das wxImage mal, nimm die ersten 18 Byte aus deinem spriteredcross Array und mach einfach folgendes:

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteredcross);
    

    Danke dir für deine Mühe aber es klappt so nicht. Mittlerweile habe ich etwas gefunden. Falls jemand wxImage für OpenGL verwenden will sollte er sich das anschauen:

    http://wiki.wxwidgets.org/Using_wxImage_to_load_textures_for_OpenGL



  • anfaenger01 schrieb:

    dot schrieb:

    Dann lass das wxImage mal, nimm die ersten 18 Byte aus deinem spriteredcross Array und mach einfach folgendes:

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteredcross);
    

    Danke dir für deine Mühe aber es klappt so nicht.

    Dann liegt der Fehler irgendwo anders.
    Selbst wenn du die ersten 18 Byte nicht ignorierst - sollte es funktionieren - nur eben mit einigen anderen Farbwerten (deine ersten 18 byte sind Tatsächlich der TGA-Header). Deine Farbinformationen liegen folgendermassen vor: blue - green - red - alpha (insofern wäre format: GL_BGRA).

    Da es scheinbar immernoch nicht klappt - wirst du wohl an anderer Stelle ein Problem haben.



  • wxImage ist nicht so wirklich geeignet für OpenGL. Leider.
    Ich würde da eher FreeImage (http://freeimage.sourceforge.net/) als Aufsatz für nehmen. Lädt die Bilder zwar in BGR aber das kann man sehr leicht switchen:

    NLResource* NLTextureLoader::getTexture(const std::string& name, const std::string& filename, const bool repeat )
    {
        FIBITMAP* dib(0);
        BYTE* pixels = NULL;
        u32 width    = 0;
        u32 height   = 0;
        u32 numcol   = 3;
    
        // Check image
        if ( FreeImage_GetFileType(filename.c_str()) == FIF_UNKNOWN )
        {
            NLError(std::string("[NLTextureLoader] Cannot determine filetype from '") + name + std::string("'"));
            return NULL;
        }
            if(FreeImage_FIFSupportsReading(FreeImage_GetFileType(filename.c_str())))
        {
            // Load Image
                    dib = FreeImage_Load(FreeImage_GetFileType(filename.c_str()), filename.c_str());
                if(!dib)
            {
                        NLError(std::string("[NLTextureLoader] Cannot load Image '") + name + std::string("' due to missing plugin from FreeImage."));
                return NULL;
            }
    
            // Convert Image
            FreeImage_FlipVertical(dib);
    
            // Get Metrics       
            width  = FreeImage_GetWidth(dib);
            height = FreeImage_GetHeight(dib);
            numcol = this->getColorsFromFormat(FreeImage_GetColorType(dib));
    
            // Convert to24 bits. In some rare cases this is needed.
            if (FreeImage_GetPitch(dib)==width*4 && FreeImage_GetColorType(dib)==FIC_RGB){
                dib=FreeImage_ConvertTo24Bits(dib);
            }
    
                    // Swap red and blue
                    FIBITMAP* red  = FreeImage_GetChannel(dib, FICC_RED);
                    FIBITMAP* blue = FreeImage_GetChannel(dib, FICC_BLUE);
    
                    FreeImage_SetChannel(dib, red, FICC_BLUE);
                    FreeImage_SetChannel(dib, blue, FICC_RED);
    
                    // Get Pixels
                    pixels = FreeImage_GetBits(dib);
    
            // Gen Texture
            u32 id = this->makeGLTexture(pixels, width, height, numcol, repeat);
    
            // Unload all images and free memory
            FreeImage_Unload(dib);
    
            // Create handle
                    NLTexture* handle = new NLTexture(name.c_str(), glm::vec2(width, height), id);
            return handle;
        }
        return NULL;
    }
    


  • Jetzt habe ich das ganze über wxWidgets implementiert. Nun habe ich das gleiche Ergebnis.


Anmelden zum Antworten