Листинг 16.2. Код шейдера OpenGL для преобразования значений RGB в CIE
const mat3 RGBtoCIEmat = mat3 ( 0.412453. 0.212671. 0.019334.
0.357580. 0.715160. 0.119193.
0.180423. 0.072169. 0.950227): vec3 cieColor = rgbColor * RGBtoCIEmat:
16.5. Интерполяция и экстраполяция изображения В 1994 г. Поль Хиберли и Дуглас Вухис опубликовали интересную статью, в ней рассказывается про операции с изображением, которые можно выполнять с помощью операций интерполяции и экстраполяции. Вообще-то эти операции программируются на профессиональных графических системах, но сейчас их легко выполнять и на обычных графических ускорителях с помощью языка шейдеров OpenGL.
Этот метод очень прост. Нужно определить конечное изображение (target), которое можно использовать совместно с исходным изображением (source) для интерполяции и экстраполяции. Уравнение является простой линейной интерполяцией, простой переход между двумя изображениями:
Imageout =({~а) Ima8e target + а Images,
Шейдеры для обработки изображения
Конечное изображение - то, с которым нужно интерполировать или экстраполировать исходное изображение. Значения 0 < а < 1 интерполируются между двумя изображениями, а значения а > 1 экстраполируются. Если а = 1, результатом является исходное изображение. Если а = 0, в результате все пикселы получаются черными. Если 0 < а < 1, результатом является линейный переход от исходного изображения к черному, то есть плавное затемнение изображения. Если а > 1, изображение, наоборот, постепенно осветляется.
Такие операции можно выполнять с изображениями (в терминах OpenGL - пиксельными прямоугольниками) во фрагментном шейдере в том порядке, в котором они отправляются на экран. В случае если конечное изображение действительно существует (а как мы видели, во многих случаях его нет), его можно сохранить в текстуре и затем обращаться к этой текстуре из фрагмептного шейдера. Если исходное и конечное изображения хранятся в памяти графического акселератора (то есть в текстурной памяти), эти операции выполняются довольно быстро, скорость ограничивается только временем доступа к памяти и скоростью выполнения операций на графическом оборудовании. Это значительно быстрее выполнения тех же операций на основном процессоре и загрузки каждый раз по шине ввода-вывода.