Seite 1 von 1

Textur aus SDL_Surface mit OpenRL rendern

Verfasst: So Jan 27, 2013 1:56 pm
von Glocke
Hi, ich versuche gerade eine Textur, die ich via SDL_Surface aus einer Bitmap lade, mit OpenGL auf ein Quad zu rendern:

Code: Alles auswählen

#include "SDL/SDL.h"
#include "SDL/SDL_opengl.h"
#include <iostream> 

using namespace std; 

int main(int, char**) {
    GLfloat rtri = 0; 
    GLuint texture; 
    SDL_Surface* textureBMP; 

    SDL_Init(SDL_INIT_VIDEO);
    SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16, SDL_OPENGL); 

    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); 
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 
    
    textureBMP = SDL_LoadBMP("example.bmp");
    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, textureBMP->w, textureBMP->h, 0, GL_RGB, GL_UNSIGNED_BYTE, textureBMP->pixels); 
    glEnable(GL_TEXTURE_2D);
  
    while(SDL_GetTicks() <= 5000) { 
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
        
        // render quad with texture
        glBindTexture(GL_TEXTURE_2D, texture); 
        glBegin(GL_QUADS); 
            glTexCoord2f(0, 0);     glVertex2f(0,0); 
            glTexCoord2f(1, 0);     glVertex2f(1,0); 
            glTexCoord2f(1, 1);     glVertex2f(1,1); 
            glTexCoord2f(0, 1);     glVertex2f(0,1); 
        glEnd(); 

        SDL_GL_SwapBuffers(); 
    } 
    SDL_FreeSurface(textureBMP);
    SDL_FreeSurface(screen);
} 
Nur wird mir das ganze als weißes Quadrat angezeigt. Was habe ich vergessen?

LG Glocke

Re: Textur aus SDL_Surface mit OpenRL rendern

Verfasst: Mo Jan 28, 2013 11:50 am
von Xin
Push den Thread Dienstag abend nochmal. ^^

Re: Textur aus SDL_Surface mit OpenRL rendern

Verfasst: Di Jan 29, 2013 7:05 pm
von Glocke
Xin hat geschrieben:Push den Thread Dienstag abend nochmal. ^^
*auf die Uhr schiel' und push*

Re: Textur aus SDL_Surface mit OpenRL rendern

Verfasst: Mi Mai 01, 2013 5:06 pm
von Glocke
Das Problem habe ich nach wie vor :lol: Das ganze habe ich mit IMG_Load etwas verallgemeinert, und versucht die Bytereihenfolge der RGB(A)-Werte zu verallgemeinern:

Code: Alles auswählen

#include <iostream> 

#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_opengl.h>

using namespace std; 

int main(int, char**) {
    GLfloat rtri = 0; 
    GLuint texture; 
    SDL_Surface* surface; 

    SDL_Init(SDL_INIT_VIDEO);
    SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16, SDL_OPENGL); 

    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); 
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 
    
    glEnable(GL_TEXTURE_2D);
    surface = IMG_Load("example.bmp");
    GLenum format;
    GLint colors = surface->format->BytesPerPixel;
    if (colors == 4) {
        if (surface->format->Rmask = 0x000000FF) {
            format = GL_RGBA;
        } else {
            format = GL_BGRA;
        }
    } else if (colors == 3) {
        if (surface->format->Rmask == 0x000000FF) {
            format = GL_RGB;
        } else {
            format = GL_BGR;
        }
    } else {
        // invalid format
        return 1;
    }
    // prepare texture
    glGenTextures(1, &texture);
    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, colors, surface->w, surface->h, 0, format, GL_UNSIGNED_BYTE, surface->pixels);
    
    while(SDL_GetTicks() <= 5000) { 
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
        
        // render quad with texture
        glBindTexture(GL_TEXTURE_2D, texture); 
        glBegin(GL_QUADS); 
            glTexCoord2f(0, 0);     glVertex2f(0,0); 
            glTexCoord2f(1, 0);     glVertex2f(1,0); 
            glTexCoord2f(1, 1);     glVertex2f(1,1); 
            glTexCoord2f(0, 1);     glVertex2f(0,1); 
        glEnd(); 

        SDL_GL_SwapBuffers(); 
    } 
    SDL_FreeSurface(surface);
    SDL_FreeSurface(screen);
} 
Mit g++ -o main main.cpp -lSDL -lSDL_image -lGL lässt es sich bauen und zeigt ein weißtes Quad an.

LG Glocke

Re: Textur aus SDL_Surface mit OpenRL rendern

Verfasst: Mi Mai 01, 2013 5:16 pm
von Glocke
Glocke hat geschrieben:Das Problem habe ich nach wie vor :lol: Das ganze habe ich mit IMG_Load etwas verallgemeinert, und versucht die Bytereihenfolge der RGB(A)-Werte zu verallgemeinern:

Code: Alles auswählen

#include <iostream> 

#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_opengl.h>

using namespace std; 

int main(int, char**) {
    GLfloat rtri = 0; 
    GLuint texture; 
    SDL_Surface* surface; 

    SDL_Init(SDL_INIT_VIDEO);
    SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16, SDL_OPENGL); 

    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); 
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); 
    
    glEnable(GL_TEXTURE_2D);
    surface = IMG_Load("example.bmp");
    GLenum format;
    GLint colors = surface->format->BytesPerPixel;
    if (colors == 4) {
        if (surface->format->Rmask = 0x000000FF) {
            format = GL_RGBA;
        } else {
            format = GL_BGRA;
        }
    } else if (colors == 3) {
        if (surface->format->Rmask == 0x000000FF) {
            format = GL_RGB;
        } else {
            format = GL_BGR;
        }
    } else {
        // invalid format
        return 1;
    }
    // prepare texture
    glGenTextures(1, &texture);
    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, colors, surface->w, surface->h, 0, format, GL_UNSIGNED_BYTE, surface->pixels);
    
    while(SDL_GetTicks() <= 5000) { 
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glLoadIdentity();
        
        // render quad with texture
        glBindTexture(GL_TEXTURE_2D, texture); 
        glBegin(GL_QUADS); 
            glTexCoord2f(0, 0);     glVertex2f(0,0); 
            glTexCoord2f(1, 0);     glVertex2f(1,0); 
            glTexCoord2f(1, 1);     glVertex2f(1,1); 
            glTexCoord2f(0, 1);     glVertex2f(0,1); 
        glEnd(); 

        SDL_GL_SwapBuffers(); 
    } 
    SDL_FreeSurface(surface);
    SDL_FreeSurface(screen);
} 
Mit g++ -o main main.cpp -lSDL -lSDL_image -lGL lässt es sich bauen und zeigt ein weißtes Quad an.

LG Glocke
/EDIT: Ich habe jetzt gerade mal noch nach glGenTexture ein glBindTexture eingefügt, jetzt geht es :lol:

Re: Textur aus SDL_Surface mit OpenRL rendern

Verfasst: Do Mai 02, 2013 10:38 am
von Xin
Da warst Du deutlich schneller als ich... wenn ein Topic nicht als 'Neu' angezeigt wird, schaue ich da oftmals nicht mehr rein.

Lesezeichen

Ich nehme mir mal vor, die Funktion "Lesezeichen setzen" (unten im Header) jetzt mal häufiger zu benutzen. Damit kann man Threads markieren und findet sie im persönlichen Bereich wieder.
Das Zeichen habe ich mal gesetzt, immerhin haben wir hier etwas, was so direkt ins Wiki übertragen werden könnte. Und damit ich weiß, warum ich das Lesezeichen hier gesetzt habe, habe ich das mal fett geschrieben. ^^