Вопрос

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

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

Это было полезно?

Решение

Когда вы создаете текстуру для 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-битное изображение не имеет прозрачности, это просто массив значений RGB.Что вы подразумеваете под «сохранением основного бита непрозрачным»?Хотите, чтобы все пиксели определенного цвета (например, все черные пиксели) были прозрачными?Если это то, что вы хотите, вы можете Google маска прозрачности opengl (см. НеХе № 20 например).

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top