Preciso de ajuda com sombreamento / iluminação 3D

8

Como vocês lidam com sombreamento em um jogo em 3D? Eu tenho uma fonte de luz direcional que sombreia um lado de uma árvore feita de cubos. Os 3 lados restantes recebem apenas sombreamento do ambiente. Portanto, o efeito 3d é perdido quando se olha para dois lados sombreados do ambiente. Estou esquecendo de algo? Devo estar protegendo o lado mais distante da fonte de luz ainda mais escura? Eu tentei olhar para Fallout 3 e parece que é isso que eles fazem, no entanto, o Minecraft parece sombrear um monte de grama com dois lados opostos claros e os dois lados opostos restantes escuros, dando o efeito de que existem duas luzes direcionais para as duas luzes lados sombreados e luz ambiente para os lados sombreados escuros.

Xavier
fonte

Respostas:

5

Seu problema é que sua luz ambiente é uma cor constante. Na realidade, a luz ambiente tende a ser brilhante do topo e escura do fundo, porque a luz normalmente vem de cima.

Há muito que você pode fazer para corrigir isso. No mínimo, você deve ter constantes de sombreamento "cor ambiente superior", "cor ambiente inferior" e "direção ambiente superior".

No shader de vértice, pegue o produto escalar da "direção ambiental superior" e o vértice normal e use o resultado para lerp entre a "cor ambiente superior" e a "cor ambiente inferior":

float value = dot( vertex_normal, top_ambient_direction ) * 0.5 + 0.5;
ambient_color = lerp( bottom_ambient_color, top_ambient_color, value );

Essa é uma das maneiras mais simples de melhorar a aparência do ambiente e foi usada com frequência nos jogos PS2 e XBOX1. Os jogos contemporâneos vão além, usando um "mapa cúbico ambiental" ou "coeficientes harmônicos esféricos ambientais".

bmcnett
fonte
3

Esse é um tópico complexo, e eu mal estou qualificado para falar sobre isso, mas vou tentar. Muitos jogos usam um mapa de luz pré-cozido que leva em consideração a luz refletida em várias superfícies e, em seguida, combina isso com a iluminação dinâmica para produzir um ambiente rápido, realista e bonito. Provavelmente, existem jogos modernos que refletem a luz em tempo real.

Algo a ter em mente é que a luz atenua com a distância; se a lâmpada estiver inclinada para uma superfície, a borda mais próxima será mais brilhante que a borda mais distante. As coisas tendem a parecer muito falsas se uma lâmpada estiver acendendo sobre elas diretamente, e não em ângulo.

A iluminação do Minecraft é especial, porque usa um sistema estranho em que a luz é tratada quase como calor difundido no mundo: http://www.minecraftwiki.net/wiki/Light Não é facilmente estendida a uma solução de uso geral.

O efeito mais bonito que já vi usado é chamado de oclusão ambiental. É caro e geralmente é usado apenas em uma solução pré-cozida, mas leva em consideração o quanto os cantos da sala são mais escuros porque as paredes obstruem a luz ambiente; o meio da parede tem o valor de luz do hemisfério atingindo-o, enquanto o canto onde três superfícies se encontram tem apenas o valor de luz do hemidemisemisfério (1/8 de esfera). https://secure.wikimedia.org/wikipedia/en/wiki/Ambient_occlusion

Há toneladas e toneladas de textos por aí nos sistemas de iluminação; pesquisar ao redor provavelmente o servirá bem.

Gregory Avery-Weir
fonte
0

A iluminação / sombreamento precisa ser mais avançada do que apenas uma decisão binária. Os blocos não são acesos ou apagados completamente por uma luz, podem ser parcialmente acesos. Às vezes, o rosto deve estar totalmente brilhante, caso em que está sendo atingido diretamente pela luz. Às vezes, você deseja apenas a luz ambiente, se for completamente intocada pela luz. No entanto, quando está parcialmente obscurecido, é necessário atribuir um valor de luz entre totalmente iluminado e totalmente apagado.

O método básico de iluminação padrão muda da luz zero para a luz máxima, com base na diferença de ângulo entre o raio de luz recebido e a superfície normal da face que você está iluminando.

Se o normal da superfície for igual (ou oposto, dependendo de como você está olhando), você terá brilho máximo. À medida que o ângulo entre a luz que entra e a superfície normal aumenta, você obtém menos e menos luz nesse rosto a partir dessa luz.

Dessa forma, com duas luzes, cada rosto deve receber um brilho que é uma combinação de quanto brilho cada luz coloca em cada rosto com base em seu ângulo.

Isso deve ser muito mais natural do que tentar determinar se um único rosto está aceso ou não. Você terá um gradiente natural à medida que as superfícies se afastarem da luz e equilibrará as superfícies afetadas por mais de uma luz.

SpacePrez
fonte