2012-01-14 3 views
0

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

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

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

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

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

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

+0

Обратите внимание, что эта ветка с 2004 года. С тех пор в области графических процессоров была выполнена большая разработка. А именно, теперь поддерживается поддержка целых (изображений) буферов и побитовых операций. Таким образом, вы находитесь в ясности при их использовании. – datenwolf

+0

А я этого не заметил. Спасибо, это, конечно, ** очень ** старая дискуссия ... Так что мне делать? Могу ли я использовать целые числа по всему конвейеру или мне все еще нужно преобразовать в float, прежде чем устанавливать мой последний цвет фрагмента? Меня особенно интересует установка альфа-канала в моем цветовом буфере FBO для определенного целочисленного значения, указанного в моем атрибуте цвета, с байтом без знака. –

ответ

1

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

+0

Считаете ли вы, что это катастрофически закончится на оборудовании OpenGL 2.0/2.1? (Единственное аппаратное обеспечение, которое может делать 3.0+, - это Sandy Bridge HD2/3000 и последние 3 поколения от Nvidia/AMD) –

+0

@StevenLu: поскольку целая операция была введена только с OpenGL-3, я бы сказал, что вы из-за неудачи с оборудованием OpenGL-2. – datenwolf

+0

Хорошо. Посмотрим, насколько хорошо это работает с проверкой равенства с плавающей точкой. –