Предварительно умноженная альфа и множественная дискретизация в OpenGL

#opengl #blending #multisampling #premultiplied-alpha

Вопрос:

Я визуализирую некоторые треугольники в многоплановую текстуру. Затем превратите эту текстуру в обычную текстуру и нарисуйте текстурированный квадрат на экране.

Мне нужна окончательная текстура, чтобы предварительно умножить альфа. Есть ли способ сообщить OpenGL об автоматическом предварительном умножении полупрозрачных пикселей в текстуре с несколькими выборками (или при размытии)?

Или единственный способ-использовать дополнительный проход шейдера для выполнения умножения вручную?

Комментарии:

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

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

Ответ №1:

Многопараметрическое решение blit не может выполнить предварительное умножение. Вам придется предварительно умножить пиксели текстуры в процессе считывания из текстуры.

Комментарии:

1. Вот что я подозревал. Дополнительная проблема, однако, заключается в том, что мне нужно нарисовать два типа объектов в текстуре с несколькими выборками: 1) смешанные прозрачные спрайты, у которых уже есть предварительно умноженная альфа, и 2) полностью непрозрачные треугольники, единственная альфа которых создается путем сглаживания (и она не умножается). Таким образом, я получаю умноженные и прямые значения в текстуре с несколькими выборками. Не уверен, что было бы лучшим способом организовать все это так, чтобы конечным результатом были все умноженные значения.