Пиксель. История одной точки - Элви Рэй Смит
Шрифт:
Интервал:
Вскоре он купит нам еще 12 8-битных кадровых буферов примерно по 40 000 долларов каждый — закон Мура в действии. Он дополнительно потратил 480 000 долларов, или около 1 900 000 долларов в пересчете на сегодняшние деньги. Так что ориентировочно к 1978 году мы располагали бóльшим количеством полноцветных пикселей, чем кто-либо еще на планете. Нам завидовало все сообщество специалистов в области компьютерной графики. Если сравнивать с сегодняшним днем, то у вашего мобильного телефона больше пиксельной памяти, чем у всех 18 кадровых буферов лаборатории вместе взятых. Напомню, что закон Мура, непрекращающаяся движущая сила, с тех пор изменился на восемь порядков.
Полноцветный 24-битный RGB сводил нас с ума. Я переписал свой Paint с 8-битными пикселями, сделав из него в 1977 году полноцветный Paint3 с 24-битными пикселями. Название указывало, что там используется три кадровых буфера. Это была первая в мире «полноцветная», или 24-битная, программа для рисования. В нем было 16 мегацветов — так много, что художник мог рисовать кистями с мягкими краями, которые не создавали зазубрин. Цвета смешивались, как будто настоящие краски. «Это как рисовать рожком мороженого», — кто-то отпустил о моей программе незабываемую шутку.
Вскоре я переделал все пиксельно-ориентированные программы в 24-битные версии. И, располагая таким большим объемом графической памяти, мы с Эдом легко и беззаботно решали, как ее использовать. В один прекрасный день мы придумали добавить четвертый канал для каждого цифрового изображения. Мы назвали его альфа-каналом. Мы делали его для решения одной конкретной проблемы, даже не осознавая будущей значимости этого. От альфа-канала зависит весь современный мир цифровых изображений.
Эд пытался решить извечную проблему скрытых поверхностей, о которой я уже говорил ранее: какие поверхности в конкретной сцене видны с точки обзора виртуальной камеры? Если не визуализировать скрытые поверхности, экономится много вычислительного времени. Тогда уже существовало несколько доступных алгоритмов, направленных на решение этой проблемы.
Эд разрабатывал новый способ, предполагавший, что виртуальная камера видит двумерный мир, разделенный на множество маленьких квадратиков, как через москитную сетку на окне (подробнее об этом я расскажу позже). Обратите внимание, что маленькие квадраты здесь — это геометрически определенные области модели, а не пиксели.
Алгоритм Эда рассчитывал пересечение каждого геометрического объекта модели с каждой из маленьких квадратных областей. Если квадрат пересекали несколько объектов, то дополнительно определялось, какая площадь каждого объекта видна виртуальной камере. Другими словами, он решал задачу о скрытых поверхностях в каждой маленькой квадратной области и представлял результат одним пикселем. Каждый пиксель соответствовал квадратной геометрической области вокруг своего местоположения. Проблема заключалась в определении одного цвета, который наилучшим образом передаст всю сложность внутри одной квадратной области.
Окончательный цвет пикселя переднего плана для квадратной области определялся как средневзвешенное значение цветов всех объектов, каждый из которых имел «вес», пропорциональный площади, которую он занимает в квадрате. Площадь квадрата, закрытая объектами, оставалась непрозрачной. Если они полностью закрывали квадрат, то этот пиксель был полностью непрозрачным. Если в квадрат не попадал ни один объект, то этот пиксель был полностью прозрачным. В противном случае он был частично непрозрачным.
Эд хотел визуализировать трехмерные объекты переднего плана на любом двумерном фоне. Чтобы протестировать алгоритм, он начал с предустановленного фонового изображения, для которого знал окончательный цвет каждого маленького квадрата, не закрытого объектами переднего плана. Но он не хотел постоянно иметь дело с «предустановленным» фоном.
Он сказал мне: «Хотелось бы найти какой-нибудь простой способ для проверки моего алгоритма на различных фонах». Мы поболтали несколько минут и быстро придумали решение. В какой-то момент определения синтетического пикселя описанный выше алгоритм вычислял результирующий цвет объектов переднего плана и степень их непрозрачности. Сочетание этого с цветом фона составляло отдельную проблему. Поэтому мы решили рассмотреть ее как отдельную задачу.
Я написал программы, которые использовались в лаборатории и для сохранения цифровых изображений в компьютерные файлы, и для их восстановления из файлов, обычно хранившихся на цифровом носителе — тогда в этой роли выступали магнитные диски. Это были первые полноцветные 24-битные программы сохранения и восстановления, потому что именно у нас раньше всех появились 24-битные пиксели. Я сразу понял, как решить проблему Эда. Нужно просто добавить четвертый канал к каждому пикселю в программах. Он будет содержать непрозрачность пикселя.
Если пиксель непрозрачен, его 8-битный альфа-канал имеет значение 255 (все единицы). Если он прозрачен, его альфа-значение равнялось 0 (все нули). Между ними доступно 254 возможных градации непрозрачности. Таким образом, каждый пиксель изображения теперь имел 32 бита: по 8 для красного, зеленого, синего цветов и альфа-канала. Мы назвали их пикселями RGBA. Благодаря системе распределения кадровых буферов Кристин Бартон мы сконфигурировали 32-битный кадровый буфер из четырех 8-битных устройств в локальной сети.
Эду предстояло изменить алгоритм так, чтобы он вычислял только цвет переднего плана и его непрозрачность для каждого пикселя, сохраняя результаты в компьютерный файл и записывая непрозрачность в новый четвертый канал. Другими словами, цвет фона просто игнорировался до следующего шага. Я же собирался переписать программу восстановления так, чтобы она распознавала новый альфа-канал и использовала его для правильного комбинирования вычисленного Эдом цвета переднего плана с произвольным фоном, который уже отображался в кадровом буфере.
Почему мы назвали его альфа? Потому что так обозначалась переменная, которую мы использовали в формуле для объединения изображения переднего плана (foreground) с изображением фона (background). Для краткости я буду называть их f и b. Альфа — это греческая буква α, но мы произносили формулу так: «альфа f плюс один минус альфа b». Идея заключалась в том, что альфа была похожа на ручку, которую можно крутить, плавно изменяя значение от 0 до 1. Под «альфа f» мы подразумеваем альфа, умноженную на f. Таким образом, при повороте ручки управления вклад в результат плавно менялся от отсутствия изображения переднего плана до полного изображения переднего плана. А «один минус альфа b» означало значение «один минус альфа», умноженное на b. При повороте ручки этот вклад менялся от полного фонового изображения до отсутствия фонового изображения.
Идея состоит в том, что крутится только одна ручка управления, а вклад двух изображений суммируется. Таким образом, ручка в крайнем положении (альфа равна 0) приводит к отсутствию изображения переднего плана и полному фоновому изображению — только фон. В другом крайнем положении ручки (альфа равна 1) мы имеем дело с полным изображением переднего плана и отсутствием фонового изображения — только передний план. Значение альфы напрямую отражает непрозрачность изображения переднего плана.
Ручка, повернутая наполовину (альфа равна 0,5), приводит к изображению, состоящему наполовину из переднего плана и наполовину из фона.
Поделиться книгой в соц сетях:
Обратите внимание, что комментарий должен быть не короче 20 символов. Покажите уважение к себе и другим пользователям!