Как убрать черный фон с текстур в OpenGL - PullRequest
3 голосов
/ 16 июня 2009

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

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

Ответы [ 5 ]

8 голосов
/ 16 июня 2009

Когда вы создаете текстуру для 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;
}
2 голосов
/ 16 июня 2009

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

    /* Set up blend */
glEnable(GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
0 голосов
/ 16 июня 2009

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

0 голосов
/ 16 июня 2009

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

0 голосов
/ 16 июня 2009

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

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

...