September 2, 2022

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
       }
           
   }
}

https://t.me/lab_sborki