float color = texturelOdut. intensity).г; // GL_PIXEL_MAP_I_TO_I Поиск по таблице отображения интенсивности на RGBA-значение можно выполнить простым обращением к текстуре:

vec4 color = texturelDOut. intensity): // GL_PIXEL_MAP_I_TO_R,G.B.A

Поиск по таблице отображения RGBA-значения на RGBA-значение требует четырех обращений к текстуре: vec4 colorOut:

colorOut.r = texturelDOut. colorIn.r).r; // GL_PIXEL_MAP_R_TO_R

colorOut.g = texturelDOut, colorln.g) ,g: // GL_PIXEL_MAP_G_TO_G

colorOut.b = texturelDOut, colorln.b) ,b: // GL_PIXEL_MAP_B_TO_B

colorOut.a = texturelDOut, colorln.a) .a: // GL PIXEL HAP A TO A

16.4. Преобразования цвета

В шейдерах OpenGL можно реализовать все разнообразие преобразований цветов. В этом разделе читатель увидит, как преобразовать CIE в RGB, и наоборот. Преобразования между другими системами цвета можно выполнить похожим способом.

Система CIE была определена в 1931 г. Международной комиссией по освещению. Эта цветовая система не зависит от каких-либо устройств и основана на восприятии цвета человеческим зрением. Комиссия установила некий первичный набор, XYZ, соответствующий восприятию цвета сетчаткой глаза. После опытов с наблюдателями-людьми первичный набор был определен так, что весь видимый цвет попадает в сочетания положительных значений X, Y и Z, а от Y зависит, насколько светлым будет оттенок цвета. В CIE-системе может быть определен любой видимый цвет. Цвета можно преобразовывать из систем, зависящих от конкретного устройства, в системы, зависящие от других устройств, или в какую-либо общую систему.

Представление данных в виде таблицы как раз подходит для выполнения таких преобразований. Стандарт HDTV имеет следующий набор первичных данных и использует белую точку DG5 (природное солнечное освещение).

Координата

R

G

в

White

X

0,640

0,300

0,150

0,3127

Y

0,330

0,600

0,060

0,3290

Z

0,030

0,100

0,790

0,3582

В листинге 16.1 приведен шейдер OpenGL, который преобразует значения цвета из системы CIE в RGB-значения стандарта HDTV с помощью точки Dgs, а в листинге 16.2 показано обратное преобразование. Таблицы, взятые из специальной литературы, выглядят транспонированными, так как в языке шейдеров OpenGL таблицы передаются по столбцам.

Листинг 16.1. Код шейдера OpenGL для преобразования значений CIE в RGB

const mat3 ClEtoRGBmat = nat3 ( 3.240479. -0.969256. 0.055648,

-1.537150. 1.875992, -0.204043,

-0.498535. 0.041556, 1.057311): vec3 rgbColor = cieColor * CIEtoRGBmat; Листинг 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.


⇐ вернуться назад | | далее ⇒