Всем известно, что спрайты у нас прямоугольные и чтобы сделать 2D изображение произвольной формы, мы используем спрайты с прозрачностью. Но добиться прозрачности на спрайте можно несколькими способами, во-первых использовать 32 битное изображение, когда на каждый тексель приходится 32 бита информации, по 8 бит (значение от 0 до 255) на каждый канал цвета: красный, зеленый, синий и 8 бит на информацию прозрачности, так называемый альфа канал. То есть, чтобы отрисовать скажем овальный спрайт у текселей, которые мы не хотим рисовать значение должно быть установлено в 255. И второй способ нарисовать спрайт произвольной формы – это закрасить «не рисуемые» участки текстуры цветом Magenta (пурпурный), у данного цвета значения каналов выглядят следующим образом: R=255, G=0, B=255.
Но это все слова, это надо проверить на практике. Я взял логотип данного сайта, он сохранен в формате .png 32 бита, т.е. с информацией о прозрачности и в графическом редакторе Paint.NET закрасил предполагаемо прозрачные части цветом Magenta и сохранил в 24 битном формате, т.е. избавился от альфа канала.
Исходное изображение
Модифицированное изображение
Далее создадим новое XNA приложение и добавим наши файлы как ресурсы проекта, объявим переменные для хранения текстур, загрузим в них наши изображения через Content Pipeline и в методе Draw отрисуем при помощи SpriteBatch.
В результате как и ожидалось, результат в обоих случаях практически одинаковый, празрачность работает, как в первом, так и во втором случае.
Проблема возникает с полупрозрачностью. Дело в том, что в 32 битном изображении у нас есть 256 уровней прозрачности, к примеру установка альфа канала в значение 128 приведет к отрисовке изображения на 50% полупрозрачным. Метод с Magenta цветом работает по принципу «все или ничего», если в цвете заливки сдвинуть хоть один бит, то эффекта прозрачности Вы уже не добьетесь. На следующем скрине в регионе внутри буквы «A» смещение цвета на 1 единицу в зеленом канале (R=255, G=1, B=255), а в букве «D» в красном канале (R=254, G=0, B=255).
Разберемся в таком поведении XNA программы именно с цветом Magenta. Все дело в Content Processor`е Texture – XNA Framework, а точнее свойстве Key Color. В теории при импорте текстур прозрачным можно сделать любой цвет. Поковырявшись в коде процессора можно найти следующий вызов
publicstaticvoid ColorKey(TextureContent texture, Color colorKey){foreach(MipmapChain chain in texture.Faces){foreach(PixelBitmapContent<Color> content in chain){ content.ReplaceColor(colorKey, Color.TransparentBlack);}}}
Как видно процессор просто напросто заменяет указанный цвет на черный цвет в выкрученной на максимум прозрачностью.
Так чем же выгоден подход с заливкой цветом Magenta по сравнению с использованием 32 битных изображений с альфа каналом? Очевидной выгодой является объем информации. Но все дело в том, что XNA хранит ресурсы в своем внутреннем формате .xnb и неважно в каком формате вы подали изображение на вход, на выходе все равно будет использоваться 32 битное изображение. Если сейчас посмотреть на скомпелированные ресурсы, то размер и 24 и 32 битных xnb файлов одинаков. Так что выгода тут только в размере файлов ресурсов проекта и удобстве использования подходов, а решать Вам.
610 Прочтений • [Alpha vs. Magenta] [08.08.2012] [Комментариев: 0]