Ich erhalte eine unerwartete Ausgabe, wenn ich SDL_image verwenden möchte, um ein Bild in eine OpenGL-Textur zu laden.SDL OpenGL-Texturen mit grünem Teint
Die entsprechenden Teile meines Codes sind:
/**
* Load texture
* @param {char*} [filename] File name to load
* @param {int*} [textw] Texture width pointer (value returned)
* @param {int*} [texth] Texture height pointer (value returned)
* @return {GLuint}
* @link http://sdl.beuc.net/sdl.wiki/OpenGL_Texture_Example
**/
GLuint LoadTexture(char *filename, int *textw, int *texth) {
GLuint textureid;
int mode;
SDL_Surface *surface = IMG_Load(filename);
// could not load filename
if (!surface) {
return 0;
}
// work out what format to tell glTexImage2D to use...
if (surface->format->BytesPerPixel == 3) { // RGB 24bit
mode = GL_RGB;
printf("GL_RGB\n");
} else if (surface->format->BytesPerPixel == 4) { // RGBA 32bit
mode = GL_RGBA;
printf("GL_RGBA\n");
} else {
SDL_FreeSurface(surface);
return 0;
}
// Record texture dimensions
*textw = surface->w;
*texth = surface->h;
// create one texture name
glGenTextures(1, &textureid);
// tell opengl to use the generated texture name
glBindTexture(GL_TEXTURE_2D, textureid);
// this reads from the sdl surface and puts it into an opengl texture
glTexImage2D(GL_TEXTURE_2D, 0, mode, surface->w, surface->h, 0, mode, GL_UNSIGNED_BYTE, surface->pixels);
// these affect how this texture is drawn later on...
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// clean up
SDL_FreeSurface(surface);
return textureid;
}
/**
* Render
* @param {GLuint} [textureid] OpenGL texture to apply
**/
void render(textureid) {
//Clear color buffer
glClear(GL_COLOR_BUFFER_BIT);
//Render quad
if (gRenderQuad) {
// Set color
glColor3f(0.0f,1.0f,0.0f);
// tell opengl to use the generated texture name
glBindTexture(GL_TEXTURE_2D, textureid);
glEnable(GL_TEXTURE_2D);
// Draw rectangle
glBegin(GL_QUADS);
// Top left
glTexCoord2i(0, 1);
glVertex2f(-1.0f, -1.0f);
// Top right
glTexCoord2i(1, 1);
glVertex2f(1.0f, -1.0f);
// Bottom left
glTexCoord2i(1, 0);
glVertex2f(1.0f, 1.0f);
// Bottom right
glTexCoord2i(0, 0);
glVertex2f(-1.0f, 1.0f);
glEnd();
glDisable(GL_TEXTURE_2D);
}
}
Die native Bild I Last ist:
Aber der Ausgang ist:
Aus was ich auf anot gelesen habe Ihr Stack Overflow post, ich glaube, es kann ein invertiertes Kanalproblem sein, aber die vorgeschlagene Lösung behebt mein Problem nicht. Was ist falsch an meinem Ansatz/Code?
Nach der Anwendung Ihres Vorschlags, der funktionierte, bemerkte ich dann, dass die Farben invertiert wurden. Ich habe dies gelöst, indem ich GL_BGRA als das Argument der glTexImage2D() -Funktion verwendet habe. –