Логика c для вычисления альфа-покрытия должна иметь те же гарантии инвариантности и пропорциональности, что и GL_SAMPLE_COVERAGE
(что позволяет указать значение покрытия с плавающей запятой, применяемое ко всем фрагментам в данной команде рендеринга ).
Однако указанные гарантии точно не указаны c:
Предполагается, что число единиц в этом значении должно быть пропорционально значению покрытия выборки со всеми 1 соответствует значению 1,0, а все 0 соответствуют 0,0.
Обратите внимание на использование слова «предназначено», а не «требуется». Спецификация c намеренно супер-нечеткая во всем этом.
Даже инвариантность действительно нечеткая:
Алгоритм может и, вероятно, должен отличаться в разных местах пикселей. Если он отличается, его следует определять относительно координат окна, а не экрана, чтобы результаты рендеринга были инвариантны относительно положения окна.
Опять же, обратите внимание на слово «следует». Здесь нет реальных требований.
Таким образом, по сути, ответ на все ваши вопросы таков: «Спецификация OpenGL не дает на это никаких гарантий».
При этом общее Суть вашего вопроса говорит о том, что вы пытаетесь (ab) использовать мультисэмплинг, чтобы выполнять перекрестное затухание между двумя перекрывающимися объектами без необходимости выполнять операцию рендеринга в текстуру. Это просто не будет работать хорошо, даже если стандарт действительно что-то гарантирует в отношении поведения альфа-покрытия.
По сути, вы пытаетесь сделать прозрачность на основе сглаживания на основе нескольких выборок. Но, как и при стандартных методах дизеринга, качество полностью зависит от количества образцов. 16-кратный мультисэмпловый буфер (который является огромным количеством мультисэмплинга) даст только эффективные 16 уровней перекрестного затухания. Это сделало бы любой вид анимированного эффекта затухания совсем не плавным.
И стоимость выполнения 16-кратного мультисэмплинга будет значительно выше, чем стоимость кросс-рендеринга в текстуру. -fading. И с точки зрения времени рендеринга, и с точки зрения затрат памяти (16-кратные мультисэмплерные буферы - гигантские c).
Если нет, то как я могу реализовать такое "идеальное" перекрестное затухание за один проход рендеринга? ?
Вы не можете; не в общем случае. Растеризаторы накапливают значения, а новые пиксели выполняют математику против накопленного значения всех предыдущих значений. Вы хотите, чтобы операция выполняла математические операции против указанной c предыдущей операции, а затем объединяла эти результаты и смешивалась с остальными предыдущими операциями.
Это просто не та математика, которую делает растеризатор.