2009-06-16 6 views
3

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

Редактировать: Да, извините, я использую черный прямо сейчас в качестве фона.

+0

Я предполагаю, что на заднем плане вы говорите об обозначенном цвете, таком как черный: R0G0B0? –

ответ

8

Когда вы создаете текстуры для OpenGL, вы хотите создать текстуру как 32-битный RGBA текстура. Создайте буфер для хранения содержимого этой новой 32-битной текстуры и повторите попытку через 24-битную растровую карту. Каждый раз, когда вы сталкиваетесь с цветом фона, установите альфу в ноль в новом 32-битном растровом изображении.

struct Color32; 
struct Color24; 

void Load24BitTexture(Color24* ipTex24, int width, int height) 
{ 
    Color32* lpTex32 = new Color32[width*height]; 

    for(x = 0; x < width; x++) 
    { 
     for(y = 0; y < height; y++) 
     { 
     int index = y*width+x; 
     lpTex32[index].r = ipTex24[index].r; 
     lpTex32[index].g = ipTex24[index].g; 
     lpTex32[index].b = ipTex24[index].b; 

     if(ipTex24[index] == BackgroundColor) 
      lpTex32[index].a = 0; 
     else 
      lpTex32[index].a = 255; 
     } 
    } 

    glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, lpTex32); 

    delete [] lpTex32; 
} 
+0

Фантастический, именно то, что я искал. Я был не совсем уверен, как альфа-канал был прочитан в OGL, после того, как он разобрал его и прочитал ваш код. Думаю, я отсортирован и готов к работе. Спасибо :) – Auraomega

-1

Звучит для меня так, как будто вы ищете буфер трафарета, который используется для такого рода задач по ограничению области рисования.

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

0

Это звучит немного запутанно. 24-битное изображение не имеет прозрачности, это просто массив значений RGB. Что вы подразумеваете под «сохранением основного бита непрозрачным»? Вы хотите иметь все пиксели с определенным цветом - например, все черные пиксели - прозрачные? Если это то, что вы хотите, вы можете отправить opengl transparency mask (см., Например, NeHe #20).

+0

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

+0

Ага, я думаю, теперь понимаю. Если у вас достаточно памяти, просто пойдите с альфа-каналом на изображении, как указывали другие. – zoul

0

Что вам действительно нужно - это альфа-канал на вашем изображении. Так как это 24 бит, у вас его нет, но вы можете создать его «на лету», когда вы загружаете изображение, просто устанавливая альфу для нуля для каждого черного (0x000000) пикселя

+1

Это было бы, вероятно, самым простым решением, если у него хватило памяти для записи. Если нет, было бы тратой потратить целый 8-битный альфа-канал на индексированную прозрачность. – zoul

2

Вам нужно будет загрузить свои текстуры с GL_RGBA форматом при вызове glTexImage2D. Если вы сделали это, то вам просто необходимо включить смесь:

/* Set up blend */ 
glEnable(GL_BLEND); 
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
+1

Я полностью неправильно понял вопрос, но один ~ ~ должен был включить blend, поэтому я не удалю свой ответ. –