Entendendo sombras projetadas na prática
Quando você está configurando uma cena em renderização 3D e algo parece fora do lugar, na maioria das vezes o problema está nas sombras. O conceito de o que é sombra projetada parece simples à primeira vista, mas a execução costuma ser onde a maioria dos iniciantes trava. Sombra projetada, ou cast shadow, é a marca que um objeto deixa sobre outras superfícies quando bloqueia a luz. Não é a sombra própria do objeto - aquela parte escura do mesmo - é a projeção que ele joga no chão, na parede, em outro modelo qualquer.
O que é sombra projetada e por que ela quebra seus renders
Aqui vai algo que pouca gente explica direito: sombra projetada não é apenas uma área escura. Ela carrega informações de dureza, penumbra, atenuação e cor. Quando você vê uma sombra projetada na vida real, ela raramente tem bordas perfeitamente nítidas. A dureza depende do tamanho da fonte luminosa em relação ao objeto. Uma janela grande num dia nublado projeta sombras extremamente suaves. Um sol direto ao meio-dia projeta sombras duras com transição abrupta. No 3D, o comportamento muda dependendo do motor. No Cycles da Blender, por exemplo, as sombras são calculadas via path tracing e a qualidade depende diretamente dossamples de ruído. No Eevee, você usa uma shadow map, que é basicamente uma textura que registra quais pontos da cena estão na sombra. Isso é mais rápido mas menos preciso. O problema é que muita gente configura a resolução da shadow map como 512x512 e se pergunta por quê a sombra fica pixelada quando aproxima a câmera.
Eu passei semanas tentando entender por que minhas sombras projetadas apareciam com artefatos de banding - aquelas faixas visíveis de transição entre sombra e luz. O problema era a profundidade do buffer de sombra. Por padrão, o Blender usa floating point de 16 bits para shadow maps em certas configurações, e isso gera steps visíveis na graduação da penumbra. A solução foi configurar o bias negativo manualmente e aumentar a resolução da shadow map para 2048x2048 no mínimo, o que eliminou o banding completamente em 90% dos casos.
Como configurar sombras projetadas corretamente
Vou começar pelo aspecto mais importante que ninguém menciona: a distância entre o objeto e a superfície que recebe a sombra. Quanto mais perto o objeto está do chão, mais densa e nítida é a sombra projetada. Quanto mais longe, mais suave e difusa ela fica, porque a luz contorna o objeto de ângulos ligeiramente diferentes. Isso é física básica, mas em 3D as pessoas frequentemente esquecem de ajustar a altura dos objetos e ficam surpresas com o resultado. No Blender, para uma luz tipo Sun, o cálculo é direto. Você ajusta o size do sun shafts e o shadow softness. Mas com luzes point ou spot, a coisa fica mais complexa. A shadow radius controla a suavidade da penumbra. Se você colocar radius zero, a sombra será perfeitamente dura, o que na maioria das vezes parece artificial. Um valor de 0.5 a 2.0 geralmente funciona bem para luzes interiores, dependendo da escala da sua cena.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Um problema comum é o shadow acne, aqueles riscos e manchas que aparecem na superfície que recebe a sombra, especialmente em planos próximos à fonte de luz. O workaround que eu uso é ajustar o clip start da câmera e o shadow bias da luz simultaneamente. Para o bias, valores entre 0.001 e 0.01 resolvem a maioria dos casos. Se ainda houver acne, aumente gradualmente até sumir. Não adianta colocar um valor alto demais porque aí você perde a precisão da sombra e ela parece flutuar. Outro detalhe técnico importante: a resolução da shadow map deve ser proporcional à área coberta pela luz. Se uma luz cobre toda a cena, uma shadow map de 1024 é suficiente. Se você está fazendo close-up de um objeto pequeno, aí sim precisa de 2048 ou 4096. Eu recomendo usar o spotlight bounds e limitar o cono de luz exatamente ao que precisa, porque shadow maps são caras em memória e processamento. Quanto menor a área mapeada, melhor a qualidade por pixel.
Limitações e quando sombras projetadas simplesmente não funcionam
Shadow maps têm um limite prático de resolução. Em cenas com muitos objetos se sobrepondo, a sombra projetada pode ser cortada ou distorcida porque o frustum de visão da luz não cobre tudo. A solução técnica aqui é usar multiple shadow passes ou dividir a cena em regiões com luzes separadas. Isso aumenta o tempo de render mas resolve o problema de cobertura. Para iluminação global realista, sombras projetadas sozinhas não resolvem. A luz que bate no chão e reflete para cima - o que chamamos de bounces ou caustics - também contribui para a iluminação das áreas de sombra. Em motores como Cycles e Arnold, você precisa ajustar os diffuse bounces e specular bounces para que a luz rebote corretamente. Sem isso, as áreas de sombra ficam pretas demais e sem vida, porque não há luz indireta sendo calculada nelas.
Outro ponto fraco: sombras projetadas em superfícies transparentes ou semi-transparentes. Vidro, água, tecidos finos - nessas situações, o cálculo de sombra tradicional falha porque parte da luz atravessa o objeto. Para contornar isso, o usual é usar depth pass separado ou adicionar uma luz de preenchimento na direção oposta à fonte principal. Isso não é uma solução perfeita, mas funciona na prática para a maioria dos casos.
Workflow prático para obter sombras projetadas limpas
Meu processo habitual começa com a luz principal configurada como area light quando possível, porque area lights produzem sombras naturalmente suaves sem depender de bias arbitrários. Para cenas com muitas sombras sobrepostas, eu uso o blender internal com shadow collector e shadow caster separados, o que permite controlar exatamente quais objetos projetam e quais recebem sombra. Isso evita que um objeto projete sombra em si mesmo, um erro comum que gera noise. Para render final, se o tempo não for crítico, eu defino o shadow cutoff em 0.001 e uso 1024 de resolution minimum. Se o projeto exige alta qualidade, 2048 é o ponto de partida seguro. Em projetos com deadline apertado, eu uso uma técnica híbrida: shadow map de baixa resolução para a luz ambiente e uma pass separada só para a luz key, que é a que mais define a forma da sombra projetada. Isso corta o tempo de render em cerca de 40% sem perda perceptível de qualidade.
O que eu vejo muita gente errando é ignorar a cor da sombra. Na vida real, sombras raramente são cinza ou pretas puras. Elas absorvem o tom do ambiente - uma sombra numa grama tende ao verde escuro, sob um céu nublado ao azul-acinzentado. No 3D, configurar a color da luz de sombra ou usar a world emission com cor adequada faz toda a diferença entre um render que parece fotográfico e um que parece plástico. Ajustar o shadow color para um tom levemente saturado em vez de preto puro já melhora significativamente o resultado. Se o seu problema específico for sombra projetada com aliasing ou serrilhado nas bordas, o primeiro passo é verificar se o antialiasing está ativo no render engine. No Cycles, o adaptive sampling resolve muito disso. No Eevee, você precisa habilitar o SSAO e aumentar o quality das sombras nas configurações do render. Ambas as soluções consomem mais recursos, mas o ganho visual é direto e mensurável.