2009-05-04 3 views
1

Эй, у меня есть этот скрипт для загрузки SDL_Surface и сохранить его как OpenGL текстуры: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); 

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

+0

Опубликовать минимальный компилируемый источник, который демонстрирует вашу проблему. Вы получите лучшие ответы. Очень сложно теоретировать, в чем проблема. – dirkgently

ответ

2

Моя ставка заключается в том, что вам нужно преобразовать 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); 

I found the original code here. Может быть и other useful posts on GameDev.

+0

Спасибо, он исправил сбой, текстура все еще не отображается ... – 2009-05-04 19:03:50

+0

Без лишнего источника было бы очень сложно определить, почему ваше blitting не работает. Можете ли вы опубликовать код, который вы используете для рендеринга? –

0

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

glEnable(GL_TEXTURE_2D);

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

+0

Это не только не помогает, но может вызвать ошибку в контексте OpenGL, поскольку фиксированное текстурирование контуров устарело в новых версиях OpenGL. – Kenji

0

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

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

Смежные вопросы