OpenGL: переход от альфа к покрытию - PullRequest
1 голос
/ 31 января 2020

Если используется альфа-покрытие без явной установки сэмплов из шейдера (аппаратная функция 4.x?), Будет ли маска покрытия для альфа-значения 'a' гарантированно представлять собой переворот маски покрытия для альфа-значения '1.fa'?

Или другими словами: если я отрисовываю два объекта в одном месте и пиксельные альфа-значения двух объектов суммируются до 1,0, тогда гарантируется, что все выборки части пикселя, в которую записываются (при условии, что оба объекта полностью покрывают пиксель)?

Причина, по которой я спрашиваю, заключается в том, что я хочу плавно затенять два объекта, и во время затенения каждый объект должен по-прежнему правильно сортировать по глубине относительно сам (не взаимодействуя со значениями глубины другого объекта и не становясь «прозрачным»).

Если нет, как я могу реализовать такое «идеальное» затухание за один проход рендеринга?

1 Ответ

2 голосов
/ 31 января 2020

Логика c для вычисления альфа-покрытия должна иметь те же гарантии инвариантности и пропорциональности, что и GL_SAMPLE_COVERAGE (что позволяет указать значение покрытия с плавающей запятой, применяемое ко всем фрагментам в данной команде рендеринга ).

Однако указанные гарантии точно не указаны c:

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

Обратите внимание на использование слова «предназначено», а не «требуется». Спецификация c намеренно супер-нечеткая во всем этом.

Даже инвариантность действительно нечеткая:

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

Опять же, обратите внимание на слово «следует». Здесь нет реальных требований.

Таким образом, по сути, ответ на все ваши вопросы таков: «Спецификация OpenGL не дает на это никаких гарантий».


При этом общее Суть вашего вопроса говорит о том, что вы пытаетесь (ab) использовать мультисэмплинг, чтобы выполнять перекрестное затухание между двумя перекрывающимися объектами без необходимости выполнять операцию рендеринга в текстуру. Это просто не будет работать хорошо, даже если стандарт действительно что-то гарантирует в отношении поведения альфа-покрытия.

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

И стоимость выполнения 16-кратного мультисэмплинга будет значительно выше, чем стоимость кросс-рендеринга в текстуру. -fading. И с точки зрения времени рендеринга, и с точки зрения затрат памяти (16-кратные мультисэмплерные буферы - гигантские c).


Если нет, то как я могу реализовать такое "идеальное" перекрестное затухание за один проход рендеринга? ?

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

Это просто не та математика, которую делает растеризатор.

...