Textur aus SDL_Surface mit OpenRL rendern

3D-Visualisierung mit der Open Graphics Library (OpenGL)
Antworten
Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Textur aus SDL_Surface mit OpenRL rendern

Beitrag von Glocke » So Jan 27, 2013 1:56 pm

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Textur aus SDL_Surface mit OpenRL rendern

Beitrag von Xin » Mo Jan 28, 2013 11:50 am

Push den Thread Dienstag abend nochmal. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Textur aus SDL_Surface mit OpenRL rendern

Beitrag von Glocke » Di Jan 29, 2013 7:05 pm

Xin hat geschrieben:Push den Thread Dienstag abend nochmal. ^^
*auf die Uhr schiel' und push*

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Textur aus SDL_Surface mit OpenRL rendern

Beitrag von Glocke » Mi Mai 01, 2013 5:06 pm

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

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: Textur aus SDL_Surface mit OpenRL rendern

Beitrag von Glocke » Mi Mai 01, 2013 5:16 pm

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:

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Textur aus SDL_Surface mit OpenRL rendern

Beitrag von Xin » Do Mai 02, 2013 10:38 am

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. ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten