Я написал библиотеку для webgl, в ней много тестов, и эти тесты прекрасно выполняются, в том числе и для смешивания.
Я настроил тест для стандартного смешивания Src_Alpha, One_minus_Src_Alpha, и тест правильно отображает результат:
Это изображение получается путем пересечения 1000 строк, каждая из которых имеет альфа-значение 0,2. Обратите внимание, что изображение не дает размытого белого цвета в любой заданной точке.
Это также текущее состояние наложения, созданное с помощью плагина webgl Spector для chrome:
Blend State
BLEND: true
BLEND_COLOR: 0, 0, 0, 0
BLEND_DST_ALPHA: ONE_MINUS_SRC_ALPHA
BLEND_DST_RGB: ONE_MINUS_SRC_ALPHA
BLEND_EQUATION_ALPHA: FUNC_ADD
BLEND_EQUATION_RGB: FUNC_ADD
BLEND_SRC_ALPHA: SRC_ALPHA
BLEND_SRC_RGB: SRC_ALPHA
Теперь я использую эту же библиотеку и отрисовываю те же края в макете, и они отрисовываются так:
Эти края имеют непрозрачность 0,2. И это режим наложения Spector:
Blend State
BLEND: true
BLEND_COLOR: 0, 0, 0, 0
BLEND_DST_ALPHA: ONE_MINUS_SRC_ALPHA
BLEND_DST_RGB: ONE_MINUS_SRC_ALPHA
BLEND_EQUATION_ALPHA: FUNC_ADD
BLEND_EQUATION_RGB: FUNC_ADD
BLEND_SRC_ALPHA: SRC_ALPHA
BLEND_SRC_RGB: SRC_ALPHA
Я бью себя по столу, пытаясь понять, в чем может быть разница между этими двумя сценариями.
Логика шейдера просто передает цвет на вершине фрагментному шейдеру, поэтому нет предварительно умноженных альфа.
Мне просто нужны мысли о том, что еще может повлиять на смешивание таким убийственным способом. Я могу опубликовать любую дополнительную информацию, необходимую.
РЕДАКТИРОВАТЬ: Чтобы показать тот же самый тест в этой среде, вот рендеринг колеса и добавление к размытию белым цветом: