Blizzard BlendAdd shading
В этом занимательном видео начиная с 19:45 разработчик из Близзард рассказывает о способе рисовать эффекты так, чтобы они хорошо выглядели и в темном и в светлом окружении, не уходя слишком в белый, но и не теряя свечения. Этот способ они называют BlendAdd.
Идея состоит в том, что в rgb мы храним изображение эффекта на черном фоне, а альфа-канал определяет насколько аддитивно, а насколько через бленд должно накладываться изображение. 1 - полностью через blend, 0 - полностью через add.
Но как же это конкретно реализовать?
Запишем выражение и раскроем скобочки:
Осталось воплотить эту формулу через параметры бленда и операции в шейдере. К dst тут явно просится OneMinusSrcAlpha, но для соответствия в альфа-канал фрагмента надо записать квадрат альфы. A для src установим One и прямо в шейдере домножим на (1 - alpha + alpha^2)
Shader "EffectBlendAdd" {
...
SubShader {
...
Blend One OneMinusSrcAlpha
...
Pass {
HLSLPROGRAM
...
half4 Fragment() {
...
output.rgb *= 1 - a + a * a;
output.a = a * a;
return outputColor;
}
ENDHLSL
}
}
}