Выходные значения фрагмента шейдера - PullRequest
0 голосов
/ 14 января 2012

Я использую свой альфа-канал в качестве 8-битного целочисленного индекса для чего-то, не связанного с смешиванием, поэтому я хочу тщательно контролировать значения битов. В частности, мне нужно, чтобы все пиксели из одной FBO-визуализированной текстуры с определенным альфа-значением соответствовали всем пикселям с одинаковым альфа-значением в шейдере. Опыт научил меня быть осторожным при сравнении значений с плавающей точкой на равенство ...

Хотя установка значений цвета с использованием плавающей запятой vec4 может не вызывать у меня проблем, и я понимаю, что даже 16-битное с плавающей точкой половинной точности сможет различать все 8-битные целочисленные (0-255) значения. Но я бы предпочел выполнять целочисленные операции во фрагментном шейдере, поэтому я уверен в значениях.

Могу ли я понизить производительность, выполнив целочисленные операции во фрагментном шейдере?

Как масштабируется выход? Я где-то читал, что допустимо посылать целочисленные векторы в качестве вывода цвета для фрагмента. Но как это масштабируется? Если я отправлю uvec4 с целыми числами 0-255, будет ли он масштабироваться соответствующим образом? Я хотел бы, чтобы он непосредственно записывал целочисленное значение в пиксельный формат, для целочисленных форматов я не хочу, чтобы он выполнял какое-либо масштабирование. Возможно, для RGBA8, отправка значения int выше 255 ограничит его значением 255, отрицательные целые числа обнулит и т. Д.

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

Здесь - соответствующая тема, которую я нашел по этой теме. Это смутило меня даже больше, чем раньше.

1 Ответ

1 голос
/ 14 января 2012

Я предлагаю не использовать альфа-канал цветового вложения, а дополнительную цель рендеринга с явным целочисленным форматом.Это доступно по крайней мере с OpenGL-3.1 (самая старая спецификация, на которую я смотрел, для этого ответа).См. Функцию OpenGL glBindFragDataLocation, которая связывает шейдер фрагментов out с переменной.В вашем случае это int out $VARIABLENAME.Для ввода в следующее состояние используйте целочисленный сэмплер .Я отсылаю вас к спецификации OpenGL-3.1 и GLSL-1.30 для деталей.

...