Быстрый приблизительный алгоритм для преобразования RGB/LAB?
Я работаю над инструментом визуализации данных с использованием OpenGL, и цветовое пространство LAB является наиболее приемлемым цветовым пространством для визуализации данных, с которыми я имею дело (3 оси данных сопоставлены с 3 осями цветового пространства). Существует ли быстрый (например, без целочисленного возведения в степень, подходящий для выполнения в шейдере) алгоритм для приблизительного преобразования значений LAB в значения RGB и из них?
1 ответ
Если вычисление фактического преобразования в шейдере слишком сложно / дорого, вы всегда можете использовать таблицу поиска. Поскольку оба цветовых пространства имеют 3 компонента, вы можете использовать 3D-текстуру RGB для представления таблицы соответствия.
Использование 3D-текстуры может показаться слишком сложным. Поскольку 8-битный компонент часто используется для представления цветов в OpenGL, вам потребуется 3D-текстура 256x256x256. При 4 байтах / тексель это 64-мегабайтная текстура, которая не возмутительна, но очень существенна.
Однако, в зависимости от того, насколько сглажены значения в таблице перевода, вам, возможно, удастся избежать более низкого разрешения. Имейте в виду, что для выборки текстур используется линейная интерполяция. Если кусочно-линейная интерполяция достаточно хороша с определенным базовым разрешением таблицы поиска, вы можете значительно уменьшить размер.
Если вы идете в этом направлении и не можете позволить себе использовать 64 МБ для LUT, вам придется поиграть с размером LUT и сделать возможный компромисс между размером и производительностью в сравнении с качеством.