C/OpenGL : geladenes Bild erscheint nur blau.
-
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#5cac38e8fd2536852406d9c8daa55023und 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.
-
Scorcher24 schrieb:
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:Danke für den Hinweis ich werde es mir anschauen. Allerdings kann es doch wohl nicht all zu schwer sein einfach einen 16x16 Sprite mit einem Alpha Kanal in die Grafikkarte zu laden.
-
Was spricht dagegen, GL_BGRA zu verwenden wenn die Daten schon so vorliegen?