2009-07-28 3 views
0

Исходя из этого моего вопроса: I'm seeing artifacts when I attempt to rotate an imageя не могу получить прозрачность в моих изображениях для работы

В исходном коде нет, я загрузку TIF, потому что я не могу за жизнь мне получить любого другой формат изображения для правильной загрузки частей прозрачности. Я пробовал PNG, GIF, & TGA. Я хотел бы иметь возможность загружать PNG. Надеюсь, что исходный код, приведенный выше, будет достаточным, если нет, то дайте мне знать.

Для лучшего описания того, что происходит, когда я пытаюсь загрузить какой-либо другой формат. Одним из изображений, которые я пытался, был оранжевый треугольник 128 * 128. В зависимости от формата, он будет либо делать 128 * 128 квадратных оранжевый, либо сделать прозрачные части изображения белыми.

ответ

1

ОК, я новичок в OpenGL + SDL, но вот что у меня есть .. Загружает все? форматы поддерживает SDL_image, за исключением того, что я не могу получить .xcf для работы и не иметь .lbm для тестирования.

//called earlier.. 
glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

//load texture 
SDL_Surface* tex = IMG_Load(file.c_str()); 
if (tex == 0) { 
    std::cout << "Could not load " << file << std::endl; 
    return false; 
} 

glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 

//nearest works but linear is best when scaled? 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

width = tex->w; 
height = tex->h; 

//IMG_is* doesn't seem to work right, esp for TGA, so use extension instead.. 
std::string ext = file.substr(file.length() - 4); 
bool isBMP = (ext.compare(".bmp") == 0) || (ext.compare(".BMP") == 0); 
bool isPNG = (ext.compare(".png") == 0) || (ext.compare(".PNG") == 0); 
bool isTGA = (ext.compare(".tga") == 0) || (ext.compare(".TGA") == 0); 
bool isTIF = ((ext.compare(".tif") == 0) || (ext.compare(".TIF") == 0) || 
       (ext.compare("tiff") == 0) || (ext.compare("TIFF") == 0)); 

//default is RGBA but bmp and tga use BGR/A 
GLenum format = GL_RGBA; 
if(isBMP || isTGA) 
    format = (tex->format->BytesPerPixel == 4 ? GL_BGRA : GL_BGR); 

//every image except png and bmp need to be converted 
if (!(isPNG || isBMP || isTGA || isTIF)) { 
    SDL_Surface* fixedSurface = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000); 
    SDL_BlitSurface(tex, 0, fixedSurface, 0); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, format, GL_UNSIGNED_BYTE, fixedSurface->pixels); 
    SDL_FreeSurface(fixedSurface); 
} else { 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, format, GL_UNSIGNED_BYTE, tex->pixels); 
} 

SDL_FreeSurface(tex); 

list = glGenLists(1); 
glNewList(list, GL_COMPILE); 
    GLint vertices[] = { 
      0,0, 0,0, 
      0,1, 0,height, 
      1,1, width,height, 
      1,0, width,0 
     }; 

    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glEnableClientState(GL_VERTEX_ARRAY); 

    glBindTexture(GL_TEXTURE_2D, texture); 
    glTexCoordPointer(2, GL_INT, 4*sizeof(GLint), &vertices[0]); 
    glVertexPointer(2, GL_INT, 4*sizeof(GLint), &vertices[2]); 
    glDrawArrays(GL_POLYGON, 0, 4); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glEndList(); 

А потом рисовать я установить цвет непрозрачный белый (не влияет на прозрачность?), То просто вызовите список ..

glColor4f(1,1,1,1); 
glCallList(list); 

И, конечно же, любая помощь для моего кода будет очень ценим! :)

+0

Я использовал биты и фрагменты из вашего кода и, наконец, работал. Оказывается, когда я загружал изображение (Я использовал свою собственную функцию вместо IMG_Load()), она отбрасывала альфа-слой, поскольку он преобразовывал BPP. Поэтому большое спасибо за ваш код. – Justen

1

Я не знаком с SDL, но поскольку это SDL, загружающий изображение, я бы приблизился к их документам. Я использую .png в своей собственной работе вместе с OpenGL, а прозрачность работает без проблем. (. Я использую .png анализатор под названием LightZPng)

Кроме того, я только что заметил ваш пост связан имеет:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

вместо:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

Это будет иметь аффект добавляя пиксели, которые должны быть прозрачными для всего, что находится в фоновом режиме (при условии, что в этих текселях альфа равна 0).

+0

Изменение, которое заставляет изображение вообще не отображаться. Даже с TIF теперь – Justen

+0

Да, может быть, альфа просто 0 для всех ваших текселей? Я бы посмотрел ваши данные изображения перед тем, как передать его glTexImage2D, чтобы подтвердить, какие значения альфа для некоторых текселей. Если они просто RGB-изображения (вообще-то не альфа), то перед рендерингом обязательно сделайте glColor4ub (255, 255, 255, 255), чтобы убедиться, что ваша альфа-функция полностью настроена на полную непрозрачность. –

2

Убедитесь, что у вас есть альфа-смешивание с поддержкой

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

иначе примитивов будет рисовать сплошные цвета там, где должна быть прозрачность. Возможно, вам понадобится другой blendfunc. Это обычная настройка.

+0

У меня есть код в моем предыдущем вопросе, связанный в первом сообщении. – Justen

+0

На самом деле у вас есть: glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); // замечаем GL_ONE вместо GL_SRC_ALPHA - это может измениться в зависимости от того, что вы видите –

+0

Извините, если у вас уже был код, я не смог прокрутить блок кода на iPhone. Как сказал Джим, blendfunc, который у вас есть, может быть неправильным. Используемый вами blendfunc предназначен для смешивания текстуры с предварительно умноженной альфой. – M84

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