Наш художник нашел этот ответ. Хотя это не может быть идентично, это очень хорошо.
OpenGL рендерится в текстуру с частичной прозрачностью (прозрачностью) и затем выводит это на экран
Мы в основном использовали вариант 2, отображая все в текстуру как обычно, начиная с черной прозрачной текстуры, но при рендеринге этой текстуры в hud измените пиксельный шейдер, чтобы просто разделить цвет по альфе.
Это работает, потому что, скажем, цвет (1, 0,5, 0,2) был добавлен к текстуре при 25% альфа, тогда цвет текстуры будет (0,25, 0,125, 0,05) и 0,25 альфа. Деление обратно на альфа 0,25 возвращает цвет (1, 0,5, 0,2), что нам и нужно.
Итак, только при использовании созданной текстуры, добавьте эту строку в конец вашего пиксельного шейдера
outcol.rgb / = outcol.a
Мы провели испытания с несколькими наложенными прозрачными пленками и не смогли определить разницу. Чем более непрозрачен цвет, тем меньше в нем исходного «черного с нулевым альфа». Он не требует никаких изменений в вашем конвейере рендеринга, кроме случаев, когда вы фактически используете созданную текстуру.
Shaun