Как убрать черный фон с текстур в OpenGL

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

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

5 ответов

Решение

Когда вы создаете текстуру для 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;
}

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

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

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

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

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

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

Другие вопросы по тегам