В компьютерной графике альфа -композитинг или альфа-смешивание — это процесс объединения одного изображения с фоном для создания видимости частичной или полной прозрачности . [1] Часто бывает полезно визуализировать элементы изображения (пиксели) в отдельных проходах или слоях, а затем объединить полученные 2D-изображения в одно окончательное изображение, называемое композитом . Композитинг широко используется в кино при объединении элементов изображения, визуализированных на компьютере, с живыми кадрами . Альфа-смешивание также используется в 2D-компьютерной графике для помещения растрированных элементов переднего плана на фон.
Для того, чтобы правильно объединить элементы изображения, необходимо сохранить связанную маску для каждого элемента в дополнение к его цвету. Этот слой маски содержит информацию о покрытии — форму рисуемой геометрии — что позволяет различать части изображения, где что-то было нарисовано, и части, которые пусты.
Хотя самая простая операция по объединению двух изображений — это наложение одного на другое, существует множество операций, или режимов смешивания , которые используются.
Концепция альфа-канала была введена Элви Рэем Смитом и Эдом Кэтмеллом в конце 1970-х годов в Лаборатории компьютерной графики Нью-Йоркского технологического института . Брюс А. Уоллес вывел тот же прямой оператор на основе физической модели отражения / пропускания в 1981 году. [2] В статье 1984 года Томаса Портера и Тома Даффа была введена предварительно умноженная альфа с использованием геометрического подхода. [3]
Использование термина альфа Смит объясняет следующим образом: «Мы назвали его так из-за классической формулы линейной интерполяции , которая использует греческую букву (альфа) для управления величиной интерполяции между, в данном случае, двумя изображениями A и B». [4] То есть, при наложении изображения A на изображение B значение в формуле берется непосредственно из альфа-канала A.
В 2D-изображении для каждого элемента изображения (пикселя) сохраняется цветовая комбинация, часто представляющая собой комбинацию красного, зеленого и синего ( RGB ). При использовании альфа-композиции каждый пиксель имеет дополнительное числовое значение, хранящееся в его альфа-канале , со значением в диапазоне от 0 до 1. Значение 0 означает, что пиксель полностью прозрачен , и цвет в пикселе под ним будет виден. Значение 1 означает, что пиксель полностью непрозрачен.
При наличии альфа-канала можно выразить операции по компоновке изображений с помощью алгебры компоновки . Например, если заданы два изображения A и B , наиболее распространенной операцией компоновки является объединение изображений таким образом, чтобы A отображалось на переднем плане, а B — на заднем. Это можно выразить как A над B. В дополнение к over Портер и Дафф [3] определили операторы компоновки in , holdout by (фраза относится к выдержке и обычно сокращается как out ), atop и xor (и обратные операторы rover , rin , rout и ratop ) из рассмотрения вариантов смешивания цветов двух пикселей, когда их покрытие, концептуально, накладывается ортогонально:
Например, оператор over можно реализовать, применив следующую формулу к каждому пикселю: [2]
Здесь , и обозначают цветовые компоненты пикселей в результате «наложения» изображения A и изображения B соответственно, примененные к каждому цветовому каналу (красный/зеленый/синий) по отдельности, тогда как , и представляют собой альфа-значения соответствующих пикселей.
Оператор over , по сути, является обычной операцией рисования (см. Алгоритм художника ). Операторы in и out являются эквивалентом альфа-композиции обрезки . Оба используют только альфа-канал второго изображения и игнорируют цветовые компоненты. Кроме того, plus определяет аддитивное смешивание. [3]
Если в изображении используется альфа-канал, доступны два распространенных представления: прямая (несвязанная) альфа и предварительно умноженная (связанная) альфа.
Наиболее существенным преимуществом предварительно умноженной альфы является то, что она позволяет выполнять правильное смешивание, интерполяцию и фильтрацию . [5] Обычная интерполяция без предварительно умноженной альфы приводит к утечке информации RGB из полностью прозрачных (A=0) областей, даже если эта информация RGB идеально невидима. При интерполяции или фильтрации изображений с резкими границами между прозрачными и непрозрачными областями это может привести к границам цветов, которые не были видны в исходном изображении. Ошибки также возникают в областях полупрозрачности, поскольку компоненты RGB не взвешены правильно, давая неправильно высокий вес цвету более прозрачных (с более низкой альфой) пикселей. [5] [6]
Предварительно умноженная альфа также может использоваться для кодирования областей обычного альфа-смешивания (например, дыма) и областей с аддитивным режимом смешивания (например, эффектов пламени и блеска) в одном и том же изображении. [7] [8] Это представлено триплетом RGBA, который выражает излучение без окклюзии, например (0,4, 0,3, 0,2, 0,0). [5]
Другим преимуществом предварительно умноженной альфы является производительность; в определенных ситуациях она может сократить количество операций умножения (например, если изображение используется много раз во время последующего композитинга). [5] Операции Портера-Даффа имеют простую форму только в предварительно умноженной альфе. [3] Некоторые конвейеры рендеринга предоставляют поверхность API «прямой альфы», но преобразуют их в предварительно умноженную альфу для производительности. [9]
Одним из недостатков предварительно умноженной альфы является то, что она может снизить доступную относительную точность значений RGB при использовании целочисленного или фиксированного представления для цветовых компонентов. Это может привести к заметной потере качества, если цветовая информация позже будет осветлена или если альфа-канал будет удален. На практике это обычно не заметно, потому что во время типичных операций композиции, таких как OVER, влияние цветовой информации низкой точности в областях с низким альфа на конечное выходное изображение (после композиции) соответственно уменьшается. Эта потеря точности также упрощает сжатие предварительно умноженных изображений с использованием определенных схем сжатия, поскольку они не записывают цветовые вариации, скрытые внутри прозрачных областей, и могут выделять меньше бит для кодирования областей с низким альфа. Те же «ограничения» более низкой битовой глубины квантования, такие как 8 бит на канал, присутствуют и в изображениях без альфы, и в результате этот аргумент является проблематичным. [5]
Предполагая, что цвет пикселя выражается с помощью прямых (не предварительно умноженных) кортежей RGBA , значение пикселя (0, 0,7, 0, 0,5) подразумевает пиксель, который имеет 70% максимальной интенсивности зеленого и 50% непрозрачности. Если бы цвет был полностью зеленым, его RGBA был бы (0, 1, 0, 0,5). [5] Однако, если этот пиксель использует предварительно умноженную альфу, все значения RGB (0, 0,7, 0) умножаются или масштабируются для окклюзии на значение альфа 0,5, которое добавляется для получения (0, 0,35, 0, 0,5). В этом случае значение 0,35 для канала G фактически указывает на 70% интенсивности зеленого излучения (с 50% окклюзией). Чистое зеленое излучение будет кодироваться как (0, 0,5, 0, 0,5). Знание того, использует ли файл прямую или предварительно умноженную альфа-канал, имеет важное значение для его правильной обработки или компоновки, поскольку требуются различные вычисления. [5]
Эмиссия без окклюзии не может быть представлена в прямом альфа-канале. В этом случае преобразование недоступно. [5]
Наиболее популярными форматами изображений, поддерживающими альфа-канал, являются PNG и TIFF . GIF поддерживает альфа-каналы, но считается неэффективным с точки зрения размера файла. Поддержка альфа-каналов присутствует в некоторых видеокодеках, таких как Animation и Apple ProRes 4444 формата QuickTime, или в многоформатном кодеке Techsmith.
Формат файла BMP, как правило, не поддерживает этот канал; однако в различных форматах, таких как 32-битный (888–8) или 16-битный (444–4), возможно сохранение альфа-канала, хотя не все системы или программы способны его читать: он эксплуатируется в основном в некоторых видеоиграх [10] или отдельных приложениях; [11] также были созданы специальные программы для создания таких BMP.
Значения RGB типичных цифровых изображений не соответствуют напрямую физической интенсивности света, а скорее сжимаются функцией гамма-коррекции :
Это преобразование позволяет более эффективно использовать ограниченное количество бит в закодированном изображении, выбирая тот вариант, который лучше соответствует нелинейному восприятию яркости человеком.
Соответственно, компьютерные программы, которые работают с такими изображениями, должны декодировать значения RGB в линейное пространство (отменяя гамма-сжатие), смешивать линейные интенсивности света и повторно применять гамма-сжатие к результату: [21] [22] [ проверка не удалась ]
В сочетании с предварительно умноженной альфой предварительное умножение выполняется в линейном пространстве до гамма-сжатия. [23] Это приводит к следующей формуле:
Обратите внимание, что альфа-канал может подвергаться гамма-коррекции, а может и не подвергаться, даже если цветовые каналы подвергаются ей.
Хотя прозрачные цвета и маски изображений используются для аналогичных целей, они не позволяют плавно смешивать наложенные пиксели изображения с пикселями фона (допускаются только целые пиксели изображения или целые пиксели фона).
Аналогичный эффект может быть достигнут с 1-битным альфа-каналом, как в 16-битном RGBA high color mode формата файла изображения Truevision TGA и связанном с ним TARGA и AT-Vista/NU-Vista графическом режиме high color. Этот режим выделяет 5 бит для каждого основного цвета RGB ( 15-битный RGB ) плюс оставшийся бит в качестве "альфа-канала".
Дизеринг можно использовать для имитации частичной окклюзии, когда доступен только 1-битный альфа-канал.
Для некоторых приложений одного альфа-канала недостаточно: например, витражное окно требует отдельного канала прозрачности для каждого канала RGB для моделирования прозрачности красного, зеленого и синего цветов по отдельности. Для точной спектральной цветовой фильтрации можно добавить больше альфа-каналов.
Некоторые методы прозрачности, не зависящие от порядка, заменяют оператор пересчета коммутативным приближением. [24]
Однако кое-что интересное происходит, когда мы генерируем следующий уровень MIP-карты...
Переключившись в режим смешивания с предварительным умножением для всех эффектов частиц, можно сделать всю сцену одним вызовом отрисовки (предполагая атласирование/двумерный массив для текстур)... Еще один полезный трюк с предварительно умноженной альфой заключается в том, что если у вас есть перекрывающиеся текстуры, которые находятся в известных положениях, вы можете предварительно обработать их все до одной текстуры.
использует прямую альфа-канал в своей поверхности API, но предварительно умноженную альфа-канал для внутренних операций рендеринга.