SDL2 - рендер на текстуре альфа-каналов
Я ищу способ визуализации конкретно на альфа-каналах текстуры. идея состоит в том, чтобы создать "маску" во время выполнения, то есть визуализировать текстуру, которая будет действовать как альфа-канал другой текстуры.
примечание: я знаю, как использовать альфа-каналы и цветовую клавишу, поэтому, пожалуйста, не объясняйте о них:), что я ищу, это способ динамически генерировать маску во время выполнения, используя другие текстуры.
Я предпочитаю решение, которое использует преимущества графической карты, а не что-то, связанное с получением буфера пикселей и манипулированием ими в процессоре.
это возможно?
2 ответа
Отвечаю за других, кому это может быть интересно:
- маска, которую я использую, представляет собой черно-белую текстуру: черный непрозрачный, белый прозрачный. маска может быть сгенерирована во время выполнения путем рендеринга в текстуру.
- когда текстура маски готова, я скопировал ее в другую текстуру и инвертировал все пиксели. Давайте назовем эту новую текстуру "перевернутая маска".
- перед рендерингом текстуры, которую я хотел замаскировать, я рендерил в той же позиции и размер перевернутой текстуры маски с аддитивным смешиванием это создаст белый силуэт в форме маски, которую я хочу применить (поскольку его аддитивные черные пиксели прозрачны).
- Затем я отрисовываю саму маску на текстуре, которую я хочу замаскировать, с добавлением смешивания это сделает фон белым (пиксели, которые, как предполагается, должны быть прозрачными для маски, теперь стали белыми. так как аддитивные, черные пиксели не действуют)
- и, наконец, я рендерил текстуру на экране с наложением модов, точно на белый силуэт, который я рендерил на 3-й фазе. Фоновые белые пиксели будут прозрачными (потому что его мод), а то, что было белым силуэтом, теперь будет текстурой с маской.
примечание: это не идеальный метод, он связан с несколькими визуализациями и манипулированием текстурными пикселями. но этого было достаточно для моего конкретного случая, и его чистый SDL настолько хорош для меня.
Извините, если я ошибаюсь, но поскольку вы сказали "на альфа-канале", то с точки зрения графики, канал не является просто подгруппой изображения AN, наряду с каналом rgb, каналом bw, звуковым каналом. (для глубины и т. д.) и т. д.
Но я думаю, что вы хотите сказать, это поместить ДРУГОЕ изображение поверх исходной маски, и изображение сверху должно выглядеть так, как будто оно покрывает изображение ниже (затем ajdust-отрегулируйте прозрачность и альт), таким образом, выделяя изображение "маски". Е.Г.: Невеста в фате (лицо невесты - это оригинальное изображение, а фата полупрозрачная. Глядя на них, вы могли бы думать о них как об одном изображении.
Есть два способа сделать это, 1 самый простой:
Отредактируйте изображение, которое будет действовать как маска, и измените его непрозрачность в программе обработки изображений, не забудьте сохранить его в png. После этого визуализируем первое изображение для текстуры, а затем отредактируем отредактированное изображение непрозрачности.
То же самое, что и первое, но не редактируйте второе изображение, просто отредактируйте его альфа-канал в SDL2. (С помощью этого метода вы можете динамически управлять им вместе со временем, а рендеринг в текстуру использует преимущества графической карты.)
В обоих случаях будет получено изображение двух слитых фотографий, а вторая выступает в роли маски.