OpenGL colorize фильтры - PullRequest
       11

OpenGL colorize фильтры

1 голос
/ 22 апреля 2011

У меня есть открытый четырехугольник GL, который отображается с градиентом серого. Я хотел бы раскрасить его, применив фильтр, что-то вроде:

Если цвет = 0,0,0, тогда установите цвет 255,255,255
Если цвет = 0,0,1, тогда установите цвет 255,255,254
и т. д., или какая-то схема, по которой я решаюсь.

Обратите внимание на причину, по которой я делаю это в оттенках серого, потому что алгоритм, который я использую, был разработан для рисования в оттенках серого, а затем раскрашен, поскольку цвета могут быть неизвестны сразу.

Это будет похоже на Java LookupOp http://download.oracle.com/javase/6/docs/api/java/awt/image/LookupOp.html.

Есть ли способ сделать это в openGL?

спасибо,
Джефф

1 Ответ

3 голосов
/ 22 апреля 2011

Вы можете интерпретировать эти цвета из градиента серого как 1-D координаты текстуры, а затем указать таблицу соответствия как 1-D текстуру.Кажется, это соответствует вашей ситуации.

В качестве альтернативы, вы можете использовать программу фрагментов (шейдер) для выполнения произвольных преобразований цвета на отдельных пикселях.


Еще несколько объяснений: что такое текстура?Концептуально текстура - это какая-то функция поиска, с некоторой дополнительной логикой сверху.

2-D текстура - это то, что для любой пары координат (s, t) или (x, y) вдиапазон [0,0] - [1,1] дает определенный цвет (RGB, RGBA, L, что угодно).Кроме того, он имеет некоторые настройки, такие как деформация или фильтрация.
Ниже текстура описывается дискретными данными заданной «плотности» - возможно, 16x16, возможно, 256x512.Процесс фильтрации позволяет задать цвет для любого действительного числа от [0,0] до [1,1] (путем смешивания / интерполяции соседних текселей или просто выбора ближайшего).

1-D текстура идентична, за исключением того, что она отображает только одно реальное значение в цвет.Поэтому его можно рассматривать как определенный тип «справочной таблицы».Вы можете считать, что это эквивалентно 2-D текстуре на основе изображения 1xN.

Если у вас есть градиент оттенков серого, вы можете визуализировать его напрямую, рассматривая значение градиента как цвет - или вы можете рассматривать его каккоординаты текстуры (= индексы в таблице поиска) и использование 1-D текстуры для произвольного преобразования цветового пространства.

Вам просто нужно перевести значения градиента (из диапазона 0..255) в[0..1] диапазон текстурных индексов.Я бы порекомендовал что-то вроде out = (in+0.5)/256.0.Значение 0.5 означает смещение на половину текселя, поскольку мы хотим указывать на середину текселя (значение внутри текстуры), а не на угол между двумя значениями.

Чтобы иметь только точный Значения RGB из справочной таблицы (= 1-D текстура), также установите фильтры текстур на GL_NEAREST.

Кстати: обратите внимание, что если вам уже нужна другая текстура для рисования градиента, то она получаетнемного сложнее, потому что вы хотите рассматривать значения, полученные из одной текстуры, как координаты для другой текстуры - и я считаю, что для этого вам понадобятся пиксельные шейдеры.Не то, чтобы шейдеры были сложными или что-то еще ... они очень удобны, когда вы изучаете основы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...