OpenGL — Как сделать 1D LUT в C ++ для GLSL

Я начинаю понимать, как реализовать фрагментный шейдер для создания 1D LUT, но я изо всех сил пытаюсь найти хорошие ресурсы, которые рассказывают вам, как сделать 1D LUT в C ++, а затем текстурировать его.

Итак, для простого примера приведена следующая 1D лут ниже:

введите описание изображения здесь

Я сделал бы массив со следующими данными?

int colorLUT[255] = {255,
254,
253,
...,
...,
...,
3,
2,
1,
0};

или же unsigned char Я думаю, так как я собираюсь текстурировать это.

Если это как создать LUT, то как мне преобразовать его в текстуру? Должен ли я использовать glTexImage1D? Или есть лучший способ сделать это? Я действительно в недоумении, любой совет будет полезен

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

Моя конечная цель — я хотел бы знать, как взять разные 1D LUT, как показано ниже, и применить их все к изображениям.

введите описание изображения здесь

4

Решение

Да, вы можете использовать 1D текстуры в качестве справочных таблиц.

Вы можете загрузить данные в 1D текстуру с glTexImage1D(), С помощью GL_R8 в качестве внутреннего формата текстуры, и указав данные как GL_UNSIGNED_BYTE при передаче его glTexImage1D(), ваш лучший выбор, если для значения достаточно 8 бит точности. Ваш звонок будет выглядеть так, с lutData быть указателем / массивом GLubyte данные и lutSize размер вашей LUT:

glTexImage1D(GL_TEXTURE_1D, 0, GL_R8, lutSize, 0, GL_RED, GL_UNSIGNED_BYTE, lutData);

Если вам нужна более высокая точность, чем 8 бит, вы можете использовать форматы, такие как GL_R16 или же GL_R32F,

Убедитесь, что вы также правильно настроили параметры текстуры, например, для линейной выборки между значениями в справочной таблице:

glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

Затем вы привязываете текстуру к sampler1D единообразно в вашем шейдере, и используйте обычные функции выборки текстур, чтобы получить новое значение. Помните, что координаты текстуры находятся в диапазоне от 0,0 до 1,0, поэтому вам необходимо отобразить диапазон ваших исходных значений на [0,0, 1,0], прежде чем передать его в функцию выборки текстуры. Новое значение, которое вы получите от функции выборки текстуры, также будет в диапазоне [0.0, 1.0].

Обратите внимание, что если ваш поиск является относительно простой функцией, может быть более эффективно вычислить функцию в шейдере. Но если LUT может содержать совершенно произвольные отображения, использование 1D текстуры — хороший способ.

В вариациях OpenGL, которые не имеют одномерных текстур, таких как OpenGL ES, вместо этого вы можете использовать 2D-текстуру с высотой, равной 1.

Если вам нужны таблицы поиска, размер которых превышает максимальный поддерживаемый размер текстуры, вы также можете посмотреть на буферные текстуры, как это предложил Андон в своем комментарии.

3

Другие решения


По вопросам рекламы [email protected]