AO Direcional

Usar a Oclusão de Ambiente tradicional é uma prática comum para aumentar o realismo em texturas, mas muitas vezes produz resultados irrealistas em objetos mais complexos.

Oclusão de ambiente tradicional

Uma maneira relativamente barata de corrigir alguns desses problemas é usar um mapa de Oclusão Direcional, existem várias maneiras de criar/usar um, vou mostrar minha própria abordagem com seus prós e contras.

Bake

Primeiro passo é fazer o bake, usei o cycles, foi bem direto, sendo a única dor de cabeça os diferentes sistemas de coordenadas entre o blender e o Unity.

Tudo o que você precisa fazer é pegar a direção do raio de luz como cor, eu criei uma textura de céu com o sistema de coordenadas correto já aplicado e depois simplesmente fiz o bake dela usando o Diffuse BSDF padrão do cycles.

O objeto sendo afetado pela textura de céu

Faça o bake de 2 imagens por direção, uma positiva e outra negativa, depois componha-as para codificar os valores no intervalo 0~1, já que o Unity não aceita valores negativos vindos de pngs.

Já que você está nisso, também pode fazer o bake de um mapa de AO Tradicional e codificá-lo como Alpha.

Depois de terminar você deve ter uma imagem que parece quase exatamente um normal map em object space, no meu caso, esta:

O AO Direcional codificado

Então, quando importar para o Unity, lembre-se de não usar sRGB e de manter a compressão o mais baixa possível.

Shader

Para colocá-lo em uso também é bem simples, faça o sample dele como uma textura comum e então decodifique-o:

fixed4 directionalAO = tex2D(_DirectionalAO, i.uv);
directionalAO = (directionalAO * 2) - 1;

Isso vai trazê-lo de volta ao seu intervalo original -1~1.

Depois você quer convertê-lo de Object Space para World Space:

directionalAO.rgb = UnityObjectToWorldNormal(directionalAO.rgb);

E com isso feito você o usa para fazer o sample da sua luz ambiente, neste caso estou usando a light probe do Unity:

fixed3 ambient = ShadeSH9(half4(directionalAO.rgb, 1));
ambient *= directionalAO.a;

E está pronto!

Porém há prós e contras nessa técnica.

Prós

  • Barato (dependendo do seu shader você pode até usá-lo no lugar da sua normal)
  • Realista
  • Pode ser usado para simular auto-sombras suaves

Contras

  • Não pode ser usado em skinned meshes
  • O fluxo de trabalho não é muito fluido

Existem outras abordagens para isso, algumas conhecidas como bent normals, eu também acredito que dê para chegar a resultados parecidos usando o ssbump da Valve.

Fique à vontade para entrar em contato comigo com qualquer dúvida ou sugestão.