2015-05-10 8 views
0

TL; DR: Какие значения зажаты и при каких обстоятельствах (включены флаги и типы рендеринга (особенно RGBA_F32)), когда включено смешение?Распутывание Когда и какие значения зажимаются в смешении OpenGL по различным целевым объектам визуализации

  • Вывод фрагмента шейдера?
  • Факторы смешивания?
  • Результат уравнения смешивания?
  • Другие?

механизмы, которые я нашел для зажима:

  1. Shader выход (через glClampColor): Это, как представляется, контролировать glReadPixels, но есть extension flagsGL_CLAMP_VERTEX_COLOR и GL_CLAMP_FRAGMENT_COLOR, которые делают «что-то ». Насколько я могу судить по спецификации расширения, они зажимают вывод из вершинного или фрагментарного шейдера.
  2. выхода шейдер (через оказывать фиксированную точку): См this answer, который цитирует GL спецификацию .: "Переход от значения с плавающей точкой ф к соответствующему беззнаковому нормализованному с фиксированной точкой значения С определяются первым зажатие f до диапазона [0, 1] ... «Напротив, (при записи на цель рендеринга с плавающей запятой, предположительно) Николь Болас пишет here, что« То, что написано фрагментарным шейдером, всегда будет развязано. ".
  3. ПОДРАЗУМЕВАЕМЫХ зажима: Из documentation for glBlendFunc: «Все масштабные коэффициенты имеют диапазон [0,1].» Означает ли это факторы источника и назначения зажаты, прежде чем уравнение происходит?
  4. КОСВЕННЫЙ зажим: Из documentation for glBlendEquation: «Для этих уравнений всех цветовых компонент поняты, чтобы иметь значение в диапазоне [0,1]» Означает ли это цвет источника и назначений зажаты до того, как происходит уравнение ?
  5. Результат зажима: Из той же странице: «Результаты этих уравнений зажаты в диапазоне [0,1]»

В моих экспериментах на RGBA_F32 визуализации мишени , ни один из этих режимов зажима не происходит (я подтверждаю это, считывая значения из цели рендеринга с помощью glGetTexImage). Мне нужно предпочтительно (3), но я прошу уточнить документацию, чтобы я мог сам это выяснить.

ответ

2

Часть материала, который вы цитировали, очень старая, и там может быть корень путаницы. Я просматриваю ваши точки с точки зрения современных GL, и я собираюсь привести в соответствие спецификацию OpenGL 4.5 core profile. Однако ни одно из них не относится к OpenGL 4.x. Это в основном неизменено с ядра GL 3.2.

1.glClampColor() Только оставшаяся функция зажимается во время glReadPixels. Цитирование спецификации на странице 680:

Обратите внимание, что команды FrontFace и ClampColor не рекомендуется, так как они до сих пор влияют на другие, не-функциональность устаревшим; однако, ClampColor цели CLAMP_VERTEX_COLOR и CLAMP_FRAGMENT_COLOR являются устаревшими.»

Закрепления выхода вершинных шейдеров были иметь смысл только для depracted встроенных varyings как gl_FrontColor, gl_BackColor и так далее. Это было только необходимо, чтобы имитировать неподвижные -функции обработка вершин, и никогда не было хорошей идеей использовать на всех. с общих выходов, то GL не имеет возможности узнать, какие значения цвета и которые один не являются.

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

Цитата из спецификации Reto Koradi не изменилась в спецификации GL 4.5. Выходы шейдера будут только зажаты, если соответствующая цель рендеринга имеет фиксированный или целочисленный формат.

3., 4. и 5. Эти документы устарели. GL спецификации это сказать об этом в разделе 17.3.8:

Если буфер цвета с фиксированной точкой, компоненты источника и назначения значения и смесь факторов, прикрепленными к каждому [0; 1] или [-1; 1] соответственно для беззнакового нормированного или подписанного нормализованного цветного буфера до оценки уравнения смешивания. Если буфер цвета является плавающей точкой, не происходит зажима. Полученные четыре значения отправляются на следующую операцию. Смешивание применяется только в том случае, если цветной буфер имеет формат с фиксированной или плавающей запятой. Если буфер цвета имеет целочисленный формат, перейдите к следующей операции.

Зажимное смешивающего результате происходит на следующем этапе, который обрабатывает дополнительное преобразование SRGB (однако, зажимной шаг там не связаны с преобразованием SRGB). Цитирование раздел 17.3.9:

Полученные значения для ц.п. R, G и В, и немодифицированного А образуют новое значение RGBA цвета. Если цветной буфер является фиксированной точкой, каждый компонент зажимается до диапазона [0; 1], а затем преобразуется в значение фиксированной точки , используя уравнение 2.3. Полученные четыре значения: , отправленные на последующую операцию сглаживания.

Так что да, при использовании GL_RGBA32F видеобуфера, нет неявного зажима не происходит вообще. И на самом деле, это единственный полезный режим работы для общего случая. Если вам нужно какое-то зажатие на этапе 3: просто зажмите факторы, прежде чем отправлять их на glBlendFunc().

+0

+1 и принять. Это отличный ответ и благодарность. Я продолжаю забывать, что спецификация - это бесконечно лучший ресурс, чем справочные страницы; Еще раз спасибо за то, что выкопали основные ссылки. Обратите внимание, что вы также рассмотрели (3) в разделе 4,5,6. – imallett

+0

@imallett: О, в вопросе нет даже точки 6 - в последнем пункте я был просто один за другим. Я исправил это. – derhass

 Смежные вопросы

  • Нет связанных вопросов^_^