Я начинаю понимать, как реализовать фрагментный шейдер для создания 1D LUT, но я изо всех сил пытаюсь найти хорошие ресурсы, которые рассказывают вам, как сделать 1D LUT в C ++, а затем текстурировать его.
Итак, для простого примера приведена следующая 1D лут ниже:
Я сделал бы массив со следующими данными?
int colorLUT[255] = {255,
254,
253,
...,
...,
...,
3,
2,
1,
0};
или же unsigned char
Я думаю, так как я собираюсь текстурировать это.
Если это как создать LUT, то как мне преобразовать его в текстуру? Должен ли я использовать glTexImage1D
? Или есть лучший способ сделать это? Я действительно в недоумении, любой совет будет полезен
Извините за краткость, но я не видел ни одного учебника о том, как на самом деле создать и связать LUT, каждый учебник по GLSL рассказывает только о шейдерах, которые они всегда игнорируют в части связывания.
Моя конечная цель — я хотел бы знать, как взять разные 1D LUT, как показано ниже, и применить их все к изображениям.
Да, вы можете использовать 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.
Если вам нужны таблицы поиска, размер которых превышает максимальный поддерживаемый размер текстуры, вы также можете посмотреть на буферные текстуры, как это предложил Андон в своем комментарии.