SDL2 - рендер на текстуре альфа-каналов

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

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

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

это возможно?

2 ответа

Решение

Отвечаю за других, кому это может быть интересно:

  1. маска, которую я использую, представляет собой черно-белую текстуру: черный непрозрачный, белый прозрачный. маска может быть сгенерирована во время выполнения путем рендеринга в текстуру.
  2. когда текстура маски готова, я скопировал ее в другую текстуру и инвертировал все пиксели. Давайте назовем эту новую текстуру "перевернутая маска".
  3. перед рендерингом текстуры, которую я хотел замаскировать, я рендерил в той же позиции и размер перевернутой текстуры маски с аддитивным смешиванием это создаст белый силуэт в форме маски, которую я хочу применить (поскольку его аддитивные черные пиксели прозрачны).
  4. Затем я отрисовываю саму маску на текстуре, которую я хочу замаскировать, с добавлением смешивания это сделает фон белым (пиксели, которые, как предполагается, должны быть прозрачными для маски, теперь стали белыми. так как аддитивные, черные пиксели не действуют)
  5. и, наконец, я рендерил текстуру на экране с наложением модов, точно на белый силуэт, который я рендерил на 3-й фазе. Фоновые белые пиксели будут прозрачными (потому что его мод), а то, что было белым силуэтом, теперь будет текстурой с маской.

примечание: это не идеальный метод, он связан с несколькими визуализациями и манипулированием текстурными пикселями. но этого было достаточно для моего конкретного случая, и его чистый SDL настолько хорош для меня.

Извините, если я ошибаюсь, но поскольку вы сказали "на альфа-канале", то с точки зрения графики, канал не является просто подгруппой изображения AN, наряду с каналом rgb, каналом bw, звуковым каналом. (для глубины и т. д.) и т. д.

Но я думаю, что вы хотите сказать, это поместить ДРУГОЕ изображение поверх исходной маски, и изображение сверху должно выглядеть так, как будто оно покрывает изображение ниже (затем ajdust-отрегулируйте прозрачность и альт), таким образом, выделяя изображение "маски". Е.Г.: Невеста в фате (лицо невесты - это оригинальное изображение, а фата полупрозрачная. Глядя на них, вы могли бы думать о них как об одном изображении.

Есть два способа сделать это, 1 самый простой:

  1. Отредактируйте изображение, которое будет действовать как маска, и измените его непрозрачность в программе обработки изображений, не забудьте сохранить его в png. После этого визуализируем первое изображение для текстуры, а затем отредактируем отредактированное изображение непрозрачности.

  2. То же самое, что и первое, но не редактируйте второе изображение, просто отредактируйте его альфа-канал в SDL2. (С помощью этого метода вы можете динамически управлять им вместе со временем, а рендеринг в текстуру использует преимущества графической карты.)

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

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