Por que alguns jogos mostram luzes brilhando através das paredes?

28

Em alguns jogos, vejo luzes brilhando através das paredes, mesmo se eu definir a qualidade do vídeo em níveis altos.

Alguns exemplos de jogos que joguei recentemente são Borderlands 2 (explosões de mísseis) e Call of Cthulhu (lanternas; o jogo ainda usa o Unreal Engine 4).

Isso é um bug ou há razões de desempenho?

Exemplo Borderlands 2: https://youtu.be/9bV83qA6_mU?t=419 (algumas vezes, mas rapidamente)

Pergunta de bônus: neste último caso, existe alguma maneira de o traçado de raios ser usado de maneira barata para resolver o problema? Eu acho que o RT caro definitivamente resolveu o problema, mas me pergunto se ele também pode ser usado de forma "barata" para resolver esse problema específico.

Marcus
fonte
21
Uma imagem vale mais que 1000 palavras.
Evorlor 21/06
8
Eu teria que jogar para testar, mas é realmente a luz que está vazando ou pode ser um efeito de partícula brilhante? Particularmente seu exemplo de explosão de míssil, eu poderia imaginar um efeito aditivo de partículas de "fogo" que provavelmente ignora colisões. As lanternas também poderiam fazer o mesmo para criar uma auréola visível, suponho ...
AC
@Evorlor adicionou um exemplo.
Marcus

Respostas:

43

Expandindo a resposta correta do TomTsagk, achei que poderia ajudar a descrever um pouco mais sobre o porquê dos jogos funcionarem dessa maneira.

A luz nos jogos realmente não "viaja" da fonte, para a superfície, para a câmera, ficando obstruída ao longo do caminho.

Para descobrir o quão brilhante é desenhar cada pixel de uma superfície com base em uma determinada luz, usamos (ou aproximamos) uma fórmula matemática que usa a direção da superfície e a direção deste ponto na superfície até a fonte de luz. É isso, apenas a direção em que ele está brilhando - normalmente não lançamos um raio para verificar se a luz realmente atinge esse pixel, porque fazer isso para cada pixel na tela e verificar o raio em relação a toda geometria detalhada na cena é geralmente ainda é muito caro para jogos em tempo real.

Portanto, por padrão, nenhuma luz do jogo projeta sombras. A direção para uma luz permanece a mesma, mesmo que haja um lançador de sombras no caminho, então a matemática nos dá o mesmo valor de brilho.

Se queremos simular sombras, temos que fazer isso separadamente. Uma maneira comum é com o que é chamado de Mapa das Sombras. Nesta versão, antes de sombrear nossa cena, primeiro renderizamos a cena da perspectiva de cada luz, como se essa luz fosse uma câmera, armazenando a profundidade de cada pixel que ela vê em uma textura fora da tela.

Então, quando sombreamos a cena, podemos comparar a distância matemática desse pixel da fonte de luz versus a profundidade que registramos no pixel correspondente no mapa de sombras. Se a profundidade do mapa de sombras for menor, significa que há outra superfície entre aqui e a luz e, em vez disso, desenhamos esse pixel na sombra.

Existem várias técnicas interessantes para fazer com que essas sombras baseadas em mapas pareçam mais agradáveis, com menos artefatos / aliases, mas vou descrevê-las por enquanto. Basta dizer que eles geralmente também não são livres.

Como isso requer renderizar (até) toda a cena novamente da perspectiva de cada luz - até seis vezes, se for uma luz pontual que brilha em todas as direções {norte, sul, leste, oeste, cima, baixo}, e precisamos re - renderize o mapa das sombras sempre que algo se mover, isso pode ficar muito caro.

Portanto, os jogos geralmente concentram seu orçamento de renderização nas luzes mais importantes da cena - como a luz direcional do sol - para garantir que tenham sombras bonitas. Luzes pequenas, de vida curta e menores, como o flash de uma explosão, são muitas vezes perdoáveis ​​se vazarem um pouco pelos oclusores. Geralmente, isso é mais agradável aos jogadores do que um problema na taxa de quadros devido a um aumento repentino no custo de renderização de toda a renderização e cálculo extra do mapa de sombras. Especialmente se for uma cena de ação movimentada, onde a fluidez é mais importante que a perfeição de pixels.

DMGregory
fonte
3
Outra ruga é que, embora seja trivial descobrir se uma fonte de luz está na frente ou atrás de uma superfície, impedir que as superfícies brilhem quando iluminadas por trás geralmente produz resultados com aparência estranha.
supercat 20/06
E isso é especialmente verdade com os efeitos das partículas (que a explosão provavelmente é, pelo menos parcialmente), uma vez que as partículas precisam ser especialmente baratas de manusear para serem muito úteis.
Luaan
2
Luzes e partículas são duas coisas diferentes. Uma partícula também pode "vazar" através de um obstáculo, mas por razões completamente diferentes. Às vezes, um sistema de partículas também inclui uma luz para ajudar a vender o efeito (pense em uma fogueira ou enxame de vaga-lumes), mas uma luz dentro de um efeito de partícula ainda é apenas uma luz, geralmente nenhuma variante especial.
DMGregory
2
Uma abordagem alternativa para sombra mapeia é volumes de sombra , que corrige o problema de aliasing, mas é mais caro: exige geometria extra para ser processado (um novo polígono por aresta silhueta de cada objeto para cada fonte de luz), bem como prestação adicional passa. Eu esperaria que a abordagem de mapeamento seja boa o suficiente para a maioria das situações.
DarthFennec
22

Para encurtar a história, isso acontece por razões de desempenho.

Quando há uma luz na tela, por padrão ela brilha em todos os objetos (obstruídos ou não), então o jogo precisaria fazer cálculos extras para ver qual objeto é afetado por quê.

Isso é mais fácil de resolver em objetos estáticos usando iluminação estática e cozida, mas isso não é o mesmo em luzes dinâmicas, como explosões observadas.

Para sua pergunta de bônus, ray tracing e cheap não combinam na mesma frase. A única razão pela qual o traçado de raios não tem sido popular até agora é o desempenho. Supondo que todas as luzes usem o traçado de raios, esse problema seria "resolvido", mas à custa do desempenho.

TomTsagk
fonte
6
Então o ray tracing é mais uma coisa importante para filmes CGI do que jogos em tempo real?
Acumulação 20/06
21
@ Accumulation Isso está correto. Um único quadro de um filme pode levar horas para renderizar, enquanto um jogo tem apenas milissegundos.
NobodyNada - Restabelecer Monica
16
Dito isso, os jogos estão explorando cada vez mais o uso de raytracing ou raymarching em conjunto com técnicas de rasterização, permitindo que o rasterizador faça o que é bom e os raios façam o que é bom. Não é um traçado de raios completo de cada pixel, mas você ainda pode obter ótimos efeitos dessa maneira.
DMGregory
2
@DMGregory De fato, jogos como o Duke Nukem 3D já usavam uma variante muito simplificada de raytracing - embora não fosse usado para iluminação dinâmica e definitivamente não rastreava todos os pixels da tela (geralmente, era feito para cada coluna pixels) e reflexões e transparência ainda eram um caso especial e não o padrão. A renderização em 3D do software sempre jogou com abordagens semelhantes; foi o hardware 3D que fechou essa avenida (até agora).
Luaan
@ Acumulação O Raytracing vem em níveis diferentes, portanto, enquanto os jogos podem, no topo da linha, disparar raios primários, eles ainda não produzem saltos secundários suficientes ou múltiplos saltos por pixel. Portanto, mesmo se você fosse traçar um raio, ainda teria trocas de desempenho semelhantes a essa. Portanto, as luzes principais de rastreamento de habilidades ainda não significam que você pode dar ao luxo de renderizar todas as luzes secundárias.
joojaa 22/06