SDL_surface для OpenGL текстуры - PullRequest
1 голос
/ 04 мая 2009

Эй, у меня есть этот скрипт, чтобы загрузить SDL_Surface и сохранить его как текстуру OpenGL:

typedef GLuint texture;

texture load_texture(std::string fname){
    SDL_Surface *tex_surf = IMG_Load(fname.c_str());
    if(!tex_surf){
        return 0;
    }
    texture ret;
    glGenTextures(1, &ret);
    glBindTexture(GL_TEXTURE_2D, ret);
    glTexImage2D(GL_TEXTURE_2D, 0, 3, tex_surf->w, tex_surf->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_surf->pixels);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    SDL_FreeSurface(tex_surf);
    return ret;
}

Проблема в том, что он не работает. Когда я вызываю функцию из основной функции, она просто не загружает изображение (при отображении просто меняет цвет рисунка), а при вызове из любой функции вне основной функции происходит сбой программы. Именно эта строка вызывает сбой программы:

2D(GL_TEXTURE_2D, 0, 3, tex_surf->w, tex_surf->h, 0, GL_RGB, GL_UNSIGNED_BYTE, tex_surf->pixels);

Кто-нибудь может увидеть ошибку в этом?

Ответы [ 3 ]

2 голосов
/ 04 мая 2009

Моя ставка заключается в том, что вам нужно преобразовать SDL_Surface, прежде чем пытаться втиснуть его в текстуру OpenGL. Вот что должно дать вам общее представление:

SDL_Surface* originalSurface; // Load like an other SDL_Surface

int w = pow(2, ceil( log(originalSurface->w)/log(2) ) ); // Round up to the nearest power of two

SDL_Surface* newSurface = 
  SDL_CreateRGBSurface(0, w, w, 24, 0xff000000, 0x00ff0000, 0x0000ff00, 0);
SDL_BlitSurface(originalSurface, 0, newSurface, 0); // Blit onto a purely RGB Surface

texture ret;

glGenTextures( 1, &ret );
glBindTexture( GL_TEXTURE_2D, ret );
glTexImage2D( GL_TEXTURE_2D, 0, 3, w, w, 0, GL_RGB,
          GL_UNSIGNED_BYTE, newSurface->pixels );

Я нашел оригинальный код здесь . На GameDev также могут быть другие полезные посты.

0 голосов
/ 30 июля 2009

Кроме того, режим смешивания текстуры GL_REPLACE по умолчанию будет умножать текущий glColor на входящие тексельные значения RGB. Следствие: glColor3f (0,0,0) даст вам черный цвет там, где должна быть ваша текстура:)

Убедитесь, что вы glColor3f (1,1,1), прежде чем рисовать свою текстурированную геометрию.

0 голосов
/ 05 мая 2009

Я не уверен, что вы делаете это где-то за пределами вашего фрагмента кода, но вы уже позвонили

glEnable(GL_TEXTURE_2D);

в какой-то момент?

...