Белый квадрат, преобразующий SDL_Surface в OPENGL_Texture - PullRequest
2 голосов
/ 18 ноября 2010

Я пытаюсь преобразовать поверхность SDL в текстуру openGL, используя фрагмент кода, который я обнаружил в интернете, после многих часов поиска большинство, похоже, используют одни и те же функции в том же порядке, так что япри условии, что я все делаю правильно.

Самокритизация, я слишком много делю свой код, мне нравится держать вещи организованными, но может быть что-то похоронено в файле, который я не делаювдаваться в подробности ...

Если коротко, то мое приложение должно отображать 2 куба, вращать их оба и позволять перемещать один.

Кубы можно создавать с помощью классаЯ написал, просто определите один и дайте ему имя файла, он должен загрузить эту текстуру и применить ее к кубу при вызове функции show.

Я частично работал с библиотекой SOIL, но ябольшая часть кода перенесена в SDL, и я бы предпочел вместо этого использовать IMG_Load.

Вот код

GLuint loadTexture(std::string filename)
{
    GLuint texture;
    if(SDL_Surface* surfaceTex = IMG_Load(filename.c_str()))
    {
        glPixelStorei(GL_UNPACK_ALIGNMENT,4);
        glGenTextures(1,&texture);
        glBindTexture(GL_TEXTURE_2D,texture);
        SDL_PixelFormat *format = surfaceTex->format;
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
        if (format->Amask)
        {
            gluBuild2DMipmaps(GL_TEXTURE_2D,4,surfaceTex->w,surfaceTex->h,GL_RGBA,GL_UNSIGNED_BYTE,surfaceTex->pixels);
        }
        else
        {
            gluBuild2DMipmaps(GL_TEXTURE_2D,3,surfaceTex->w,surfaceTex->h,GL_RGBA,GL_UNSIGNED_BYTE,surfaceTex->pixels);
        }
        SDL_FreeSurface(surfaceTex);
    }
    else
    {
        log("Loading texture failed!",true);
    }
    return texture;
}

Я действительно хочу, чтобы код был переносимым между проектами, поэтому я могу простоскажем

Gluint Tex = loadTexture(filename);

аи текстура готова.

ОБНОВЛЕНИЕ:

Вот метод показа для отображения куба

cubeTexture = loadTexture(filename);
glLoadIdentity();
glTranslatef(xPos,yPos,zPos);
xRotate = 1.0;
yRotate = 1.0;
zRotate = 1.0;
glRotatef(angle,xRotate,yRotate,zRotate);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, cubeTexture);
glBegin(GL_QUADS);
    /* Top face */
    glNormal3f(0.0f,0.0f,1.0f); /* Top face normal */
    glTexCoord2f(0.0f,  0.0f);  glVertex3f( Width,      Height,    -Depth); /* top right */
    glTexCoord2f(1.0f,  0.0f);  glVertex3f(-Width,      Height,    -Depth); /* top left */
    glTexCoord2f(1.0f,  1.0f);  glVertex3f(-Width,      Height,     Depth); /* bottom left */
    glTexCoord2f(0.0f,  1.0f);  glVertex3f( Width,      Height,     Depth); /* bottom right */
    /* Bottom face */
    glNormal3f(0.0f,0.0f,-1.0f); /* Bottom face normal */
    glTexCoord2f(1.0f,  0.0f);  glVertex3f( Width,     -Height,     Depth); /* top right */
    glTexCoord2f(1.0f,  1.0f);  glVertex3f(-Width,     -Height,     Depth); /* top left */
    glTexCoord2f(0.0f,  1.0f);  glVertex3f(-Width,     -Height,    -Depth); /* bottom left */
    glTexCoord2f(0.0f,  0.0f);  glVertex3f( Width,     -Height,    -Depth); /* bottom right */
    /* Front face */
    glNormal3f(0.0f,1.0f,0.0f); /* Front face normal */
    glTexCoord2f(0.0f,  1.0f);  glVertex3f( Width,      Height,     Depth); /* top right */
    glTexCoord2f(0.0f,  0.0f);  glVertex3f(-Width,      Height,     Depth); /* top left */
    glTexCoord2f(1.0f,  0.0f);  glVertex3f(-Width,     -Height,     Depth); /* bottom left */
    glTexCoord2f(1.0f,  1.0f);  glVertex3f( Width,     -Height,     Depth); /* bottom right */
    /* Back face */
    glNormal3f(0.0f,-1.0f,0.0f); /* Back face normal */
    glTexCoord2f(1.0f,  1.0f);  glVertex3f( Width,     -Height,    -Depth); /* top right */
    glTexCoord2f(0.0f,  1.0f);  glVertex3f(-Width,     -Height,    -Depth); /* top left */
    glTexCoord2f(0.0f,  0.0f);  glVertex3f(-Width,      Height,    -Depth); /* bottom left */
    glTexCoord2f(1.0f,  0.0f);  glVertex3f( Width,      Height,    -Depth); /* bottom right */
    /* Left face */
    glNormal3f(-1.0f,0.0f,0.0f); /* Left face normal */
    glTexCoord2f(1.0f,  0.0f);  glVertex3f(-Width,      Height,     Depth); /* top right */
    glTexCoord2f(1.0f,  1.0f);  glVertex3f(-Width,      Height,    -Depth); /* top left */
    glTexCoord2f(0.0f,  1.0f);  glVertex3f(-Width,     -Height,    -Depth); /* bottom left */
    glTexCoord2f(0.0f,  0.0f);  glVertex3f(-Width,     -Height,     Depth); /* bottom right */
    /* Right face */
    glNormal3f(1.0f,0.0f,0.0f); /* Right face normal */
    glTexCoord2f(0.0f,  0.0f);  glVertex3f( Width,      Height,    -Depth); /* top right */
    glTexCoord2f(1.0f,  0.0f);  glVertex3f( Width,      Height,     Depth); /* top left */
    glTexCoord2f(1.0f,  1.0f);  glVertex3f( Width,     -Height,     Depth); /* bottom left */
    glTexCoord2f(0.0f,  1.0f);  glVertex3f( Width,     -Height,    -Depth); /* bottom right */

glEnd();

и моей функции GL_INIT

glEnable(GL_TEXTURE_2D);            /* Enable Texture Mapping                           */
    glShadeModel(GL_SMOOTH);            /* Enable smooth shading                            */
    glClearColor(0.0f,0.0f,0.0f,0.0f);  /* Set the background black                         */
    glClearDepth(1.0f);                 /* Set the depth buffer up                          */
    glEnable(GL_DEPTH_TEST);            /* Set Depth testing up                             */
    glDepthFunc(GL_LEQUAL);             /* Sets the type of depth testing to Less or Equal  */
    glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);   /* Uses the nice perspective calcs  */
    glLightfv(GL_LIGHT1,GL_AMBIENT,LightAmbient);       /* Sets up the ambient light        */ //test
    glLightfv(GL_LIGHT1,GL_DIFFUSE,LightDiffuse);       /* Sets up the diffuse light        */ //test
    glLightfv(GL_LIGHT1,GL_POSITION,LightPosition);     /* Sets up the light position       */ //test
    glEnable(GL_LIGHT1);                                /* Enable the first light           */

Ответы [ 2 ]

1 голос
/ 19 ноября 2010

Обязательно glEnable(GL_TEXTURE_2D).

Кроме того, ваш второй gluBuild2DMipmaps() вызов должен занять GL_RGB, а не GL_RGBA. В противном случае он считывает после конца surfaceTex->pixels.

Попробуйте это:

#include <iostream>

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

using namespace std;

GLuint loadTexture(std::string filename)
{
    GLuint texture;
    if(SDL_Surface* surfaceTex = IMG_Load(filename.c_str()))
    {
        glPixelStorei(GL_UNPACK_ALIGNMENT,4);
        glGenTextures(1,&texture);
        glBindTexture(GL_TEXTURE_2D,texture);
        SDL_PixelFormat *format = surfaceTex->format;
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
        if (format->Amask)
        {
            gluBuild2DMipmaps(GL_TEXTURE_2D,4,surfaceTex->w,surfaceTex->h,GL_RGBA,GL_UNSIGNED_BYTE,surfaceTex->pixels);
        }
        else
        {
            gluBuild2DMipmaps(GL_TEXTURE_2D,3,surfaceTex->w,surfaceTex->h,GL_RGB,GL_UNSIGNED_BYTE,surfaceTex->pixels);
        }
        SDL_FreeSurface(surfaceTex);
    }
    else
    {
        return 0;
    }
    return texture;
}


int main(int argc, char* argv[])
{
    _putenv("SDL_VIDEO_CENTERED=1"); 

    SDL_Init(SDL_INIT_EVERYTHING); 

    int win_w = 800;
    int win_h = 600;
    SDL_Surface* display = SDL_SetVideoMode(win_w, win_h, 32, SDL_OPENGL);

    GLuint tex = loadTexture("concrete.png");

    bool running = true;
    while( running )
    {
        // handle all pending events
        SDL_Event event;
        while( SDL_PollEvent(&event) )
        {
            switch (event.type)
            {
                case SDL_KEYDOWN:
                    if( event.key.keysym.sym == SDLK_ESCAPE ) 
                        running = false;
                    break;
                case SDL_QUIT:
                    running = false;
                    break;
                default:
                    break;
            }
        }

        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

        glMatrixMode(GL_PROJECTION); 
        glLoadIdentity();
        glOrtho(0, win_w, 0, win_h, -10.0, 10.0);
        glMatrixMode(GL_MODELVIEW); 
        glLoadIdentity();

        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, tex);

        glPushMatrix();
        glScalef(200,200,200);
        glBegin(GL_TRIANGLES);
        glTexCoord2f(0,0);
        glVertex2f(0,0);
        glTexCoord2f(1,0);
        glVertex2f(1,0);
        glTexCoord2f(1,1);
        glVertex2f(1,1);
        glEnd();
        glPopMatrix();

        SDL_GL_SwapBuffers();
        SDL_Delay( 1 );
    }

    SDL_Quit();

    return 0;
}

concrete.png:

concrete.png

0 голосов
/ 18 ноября 2010
...