float luma = dot(vec3 (0.299, 0.587. 0.114). rgbColor);
Шейдеры для обработки изображения
16.3. Операции поиска в таблице В OpenGL определено несколько таблиц, и часть из них используется для работы с изображениями. Таблицы - это простой способ отображения входного значения на одно или несколько значений, что помогает при обработке цвета. Так как в OpenGL появилась возможность работы с программируемыми процессорами, входные значения можно вычислять в шейдере, затем выполнять поиск в таблице и использовать полученные значения при дальнейших вычислениях в том же шейдере. Это открывает множество новых возможностей использования таблиц поиска.
Один из эффективных способов выполнить операцию поиска в шейдере OpenGL - использовать одномерную текстурную карту. Таблица поиска может быть произвольного размера (хотя во многих реализациях OpenGL этот размер ограничен 256 записями), и в ней можно отображать входное значение как на одно выходное значение, так и на двух-, трех- или четырехкомпонентное значение. Если возвращаемые значения должны быть дискретными, режим одномерной текстуры устанавливается в GL_NEAREST. Если же нужна интерполяция между соседними значениями, устанавливается GL_L I NEAR.
Значение интенсивности в диапазоне [0,1] можно принять в качестве текстурной координаты для доступа к одномерной текстуре. Встроенные функции работы с текстурами всегда возвращают значение RGBA. Если одноканальная текстура связана с текстурным модулем, на который указывает семплер, значение текстуры будет храниться во всех каналах (красном, зеленом и синем), и можно взять значение из любого канала:
float color = texturelDClut. intensity) .г: // GL_PIXEL_MAP_I_TO_I
Поиск по таблице отображения интенсивности на RGBA-значение можно выполнить простым обращением к текстуре:
vec4 color = texturelDClut. intensity); // GL_PIXEL_MAP_I_TO_R.G.B.A
Поиск по таблице отображения RGBA-значения на RGBA-значение требует четырех обращений к текстуре: vec4 colorOut:
colorOut.r = texturelDClut. colorln.г).г : // GL_PIXEL_MAP_R_TO_R