Войти
OpenGL communityФорумВопросы по программированию

фрагментный шейдер и пиксельный прямоугольник - возможно ли совместное использование?

#0
23:17, 4 авг. 2014

Приветствую.

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

Также есть другие уже написанные участки кода, занимающиеся 3D-отображением подобных же массивов, где функция преобразования величины в цвет реализуется через фрагментный шейдер.

Поскольку в обоих случаях требуется одна и та же зависимость цвета от величины, хотелось бы повторно использовать уже имеющуюся функцию преобразования величины в цвет. Но насколько я понимаю, операция вроде glWritePixels будет сразу писать в фреймбуффер, не задействуя шейдер.

Есть ли все же какая-либо возможность использовать одну и ту же функцию преобразования и в фрагментном шейдере 3D-кода, и для пиксельного прямоугольника? То есть, если в будущем будет изменение вида этой функции, чтоб изменения произошли сразу в обоих местах?

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


#1
23:32, 4 авг. 2014

Dmitry_Milk
> Как вариант вижу рисовать прямоугольник путем натягивания на него текстуры с
> нужным пиксельным содержимым
Именно так и делается.

Dmitry_Milk
> но мне такой вариант не нравится - мне нужно четкое отображение: один элемент
> массива - один пиксел.
Придётся похимичить с координатами. Сделай ортогональную проекцию с размерами, как у окна и задавай размер прямоугольника в пикселях.

#2
16:36, 24 авг. 2014

При реализации вышенаписанного с помощью текстуры, содержащей значения, преобразуемые в цвет фрагментным шейдером, наткнулся на засаду: значения в текстуре клиппируются. Пробовал для хранения значений разные internalformat (в частности, GL_DEPTH_COMPONENT, предполагая, что уж глубина точно не должна клиппироваться к диапазону 0.0 - 1.0). Но безрезультатно.

В какую сторону смотреть, чтоб избежать клиппирования хранимых значений?

#3
17:00, 24 авг. 2014

Dmitry_Milk
> В какую сторону смотреть, чтоб избежать клиппирования хранимых значений?
В сторону floating point текстур же. Например внутренний формат GL_RGBA32F и подобные вариации с другими числом каналов и точностью. Ну и тип с форматом надо не забыть правильно указать.

#4
17:50, 24 авг. 2014

Хм, действительно, не заметил таблицу с кастомными форматами. Так работает, спасибо.

OpenGL communityФорумВопросы по программированию

Тема в архиве.