Насколько я знаю, в DX или GL нет способа повторно использовать альфа-канал RT 0 для всех операций смешивания. К сожалению, это не то, что поддерживается аппаратно.
Вы можете настроить различные режимы наложения для каждой цели рендеринга или включить наложение для одних и отключить для других; однако, если смешивание включено для цели рендеринга, оно всегда использует свою собственную альфу.
Там также режим , называемый «двойной источник смешиванием» (см DX11 дока и OGL док ), которая позволяет определить альфа для смешивания с совершенно отдельным выходом из пиксельных шейдеров, не оказывает альфа - канал цели. Однако этот режим работает только с одной целью рендеринга на текущем оборудовании.
Итак, насколько я могу судить, единственные варианты смешивания нескольких целей рендеринга с одной и той же альфа-версией:
- Выведите одну и ту же альфу на все цели рендеринга (например, жертвуя возможностью сохранять другие значения в альфа-канале, как при отложенном затенении).
- Повторите рендеринг в отдельном проходе для каждой цели рендеринга, используя смешивание с двумя источниками.
- Используйте БПЛА / хранилище изображений для выполнения смешивания в пиксельном шейдере (работает только в том случае, если геометрия не является самоперекрывающейся в пространстве экрана, потому что нет защиты от условий гонки; также, вероятно, довольно медленно).
- На оборудовании, поддерживающем его, DX11.3 / DX12 Rasterizer-Order Views , NV_fragment_shader_interlock или INTEL_fragment_shader_ordering (последний также доступен в графических процессорах AMD). Это три названия одной и той же вещи: в основном «критическая секция» в пиксельном шейдере, которая позволяет атомарно считывать, изменять и записывать текстуру по отношению к другим вызовам пиксельных шейдеров. По сути, он допускает произвольное программируемое смешивание, но, вероятно, он довольно медленный и доступен только на новейшем оборудовании.