Os gráficos em tempo real implementam uma variedade de aproximações para lidar com as despesas computacionais de simulação de iluminação indireta, trocando entre desempenho em tempo de execução e fidelidade à iluminação. Esta é uma área de pesquisa ativa, com novas técnicas aparecendo a cada ano.
Iluminação ambiente
No final mais simples da faixa, você pode usar a iluminação ambiente : uma fonte de luz omnidirecional global que se aplica a todos os objetos da cena, sem levar em consideração as fontes de luz reais ou a visibilidade local. Isso não é nada preciso, mas é extremamente barato, fácil para um artista ajustar e pode parecer bom dependendo da cena e do estilo visual desejado.
As extensões comuns à iluminação ambiente básica incluem:
- Faça a cor do ambiente variar na direção, por exemplo, usando harmônicos esféricos (SH) ou um pequeno mapa de cubos e procurando a cor em um sombreador com base no vetor normal de cada vértice ou pixel. Isso permite alguma diferenciação visual entre superfícies de diferentes orientações, mesmo quando nenhuma luz direta as atinge.
- Aplique técnicas de oclusão ambiental (AO) , incluindo AO pré-calculado de vértice, mapas de textura de AO , campos de AO e AO de espaço na tela (SSAO) . Tudo isso funciona ao tentar detectar áreas como buracos e fendas nas quais a luz indireta tem menor probabilidade de se infiltrar e escurecer a luz ambiente lá.
- Adicione um mapa cúbico do ambiente para fornecer reflexão especular do ambiente. Um mapa cúbico com uma resolução decente (128² ou 256² por face) pode ser bastante convincente para especular em superfícies curvas e brilhantes.
Iluminação indireta cozida
O próximo "nível", por assim dizer, de técnicas envolve assar (pré-computar offline) alguma representação da iluminação indireta em uma cena. A vantagem do cozimento é que você pode obter resultados de alta qualidade por pouco custo computacional em tempo real, uma vez que todas as partes duras são feitas no cozimento. As desvantagens são que o tempo necessário para o processo de cozimento prejudica a taxa de iteração dos projetistas de nível; são necessários mais memória e espaço em disco para armazenar os dados pré-computados; a capacidade de alterar a iluminação em tempo real é muito limitada; e o processo de cozimento só pode usar informações da geometria do nível estático, para que efeitos de iluminação indireta de objetos dinâmicos, como caracteres, sejam perdidos. Ainda assim, a iluminação cozida é muito usada atualmente nos jogos AAA.
A etapa de preparação pode usar qualquer algoritmo de renderização desejado, incluindo rastreamento de caminho, radiosidade ou usar o próprio mecanismo de jogo para renderizar mapas de cubo (ou hemicubos ).
Os resultados podem ser armazenados em texturas ( mapas de luz ) aplicados à geometria estática no nível e / ou também podem ser convertidos em SH e armazenados em estruturas de dados volumétricas, como volumes de irradiância ( volumes de irradiância (texturas de volume em que cada texel armazena uma sonda SH) ou malhas tetraédricas . Em seguida, você pode usar sombreadores para procurar e interpolar cores dessa estrutura de dados e aplicá-las à sua geometria renderizada. A abordagem volumétrica permite que a iluminação embutida seja aplicada a objetos dinâmicos e também à geometria estática.
A resolução espacial dos mapas de luz etc. será limitada pela memória e outras restrições práticas, portanto, você pode suplementar a iluminação de forno com algumas técnicas de AO para adicionar detalhes de alta frequência que a iluminação de forno não pode fornecer e responder a objetos dinâmicos (como escurecer a luz indireta sob um personagem ou veículo em movimento).
Há também uma técnica chamada transferência de radiação pré-computada (PRT) , que estende o cozimento para lidar com condições de iluminação mais dinâmicas. No PRT, em vez de aplicar a própria iluminação indireta, você utiliza a função de transferência de alguma fonte de luz - geralmente o céu - para a iluminação indireta resultante na cena. A função de transferência é representada como uma matriz que transforma os coeficientes SH de origem em destino em cada ponto de amostra de cozimento. Isso permite que o ambiente de iluminação seja alterado e a iluminação indireta na cena responderá de forma plausível. Far Cry 3 e 4 usaram essa técnica para permitir um ciclo contínuo dia-noite, com iluminação indireta variando com base nas cores do céu a cada hora do dia.
Outro ponto sobre o cozimento: pode ser útil ter dados cozidos separados para iluminação indireta difusa e especular. Os mapas de cubos funcionam muito melhor que o SH para especular (já que os mapas de cubos podem ter muito mais detalhes angulares), mas também ocupam muito mais memória, portanto você não pode se dar ao luxo de colocá-los tão densamente quanto as amostras de SH. A correção de paralaxe pode ser usada para compensar isso, distorcendo heuristicamente o mapa do cubo para tornar suas reflexões mais fundamentadas na geometria ao seu redor.
Técnicas totalmente em tempo real
Por fim, é possível calcular a iluminação indireta totalmente dinâmica na GPU. Pode responder em tempo real a mudanças arbitrárias de iluminação ou geometria. No entanto, novamente há uma troca entre desempenho em tempo de execução, fidelidade de iluminação e tamanho da cena. Algumas dessas técnicas precisam de uma GPU robusta para funcionar, e podem ser viáveis apenas para tamanhos limitados de cena. Eles também costumam suportar apenas um único salto de luz indireta.
- Um mapa cúbico de ambiente dinâmico, em que as faces do mapa cúbico são renderizadas novamente a cada quadro usando seis câmeras agrupadas em torno de um ponto escolhido, pode fornecer boas e decentes boas reflexões ambientais para um único objeto. Isso geralmente é usado para o carro do jogador em jogos de corrida, por exemplo.
- Iluminação global do espaço da tela , uma extensão do SSAO que reúne a iluminação refletida dos pixels próximos na tela em um passe de pós-processamento.
- A reflexão rastreada por raios no espaço da tela funciona marcando os raios através do buffer de profundidade em um pós-passe. Ele pode fornecer reflexões de alta qualidade, desde que os objetos refletidos estejam na tela.
- A radiosidade instantânea funciona rastreando raios na cena usando a CPU e colocando uma luz pontual em cada ponto de impacto do raio, que representa aproximadamente a luz refletida de saída em todas as direções daquele raio. Essas muitas luzes, conhecidas como luzes de ponto virtuais (VPLs), são renderizadas pela GPU da maneira usual.
- Os mapas de sombra reflexiva (RSMs) são semelhantes à radiosidade instantânea, mas os VPLs são gerados renderizando a cena do ponto de vista da luz (como um mapa de sombra) e colocando um VPL em cada pixel deste mapa.
- Os volumes de propagação de luz consistem em grades 3D de sondas SH colocadas ao longo da cena. Os RSMs são renderizados e usados para "injetar" a luz refletida nas sondas SH mais próximas das superfícies refletivas. Em seguida, um processo semelhante a inundação propaga a luz de cada sonda SH para os pontos circundantes da grade, e o resultado disso é usado para aplicar iluminação à cena. Essa técnica também foi estendida à dispersão volumétrica de luz .
- O rastreamento do cone Voxel funciona voxelizando a geometria da cena (provavelmente usando resoluções diferentes de voxel, mais finas perto da câmera e mais grosseiras longe), injetando luz dos RSMs na grade voxel. Ao renderizar a cena principal, o pixel shader executa um "rastreamento de cone" - uma marcha de raio com raio gradualmente crescente - através da grade de voxel para reunir a luz que entra para sombreamento difuso ou especular.
Atualmente, a maioria dessas técnicas não é amplamente usada em jogos devido a problemas de expansão para tamanhos de cenas realistas ou outras limitações. A exceção é a reflexão do espaço na tela, que é muito popular (embora geralmente seja usada com mapas de cubos como substituto, para regiões onde a parte do espaço na tela falha).
Como você pode ver, a iluminação indireta em tempo real é um tópico enorme e mesmo essa resposta (bastante longa!) Pode fornecer apenas uma visão geral e um contexto de 10.000 pés para leitura adicional. Qual abordagem é a melhor para você dependerá muito dos detalhes de seu aplicativo em particular, de quais restrições você está disposto a aceitar e de quanto tempo precisará dedicar a ele.
Esse é o principal problema "difícil" que permanece no CG em tempo real, e há muita pesquisa em andamento para resolvê-lo.
O maior obstáculo é que, nos gráficos de varredura, cada componente da cena é renderizado 'no vácuo' - cada triângulo é renderizado sem referência a outros triângulos da cena e o mesmo vale para pixels, em oposição às abordagens de rastreamento de raios. onde cada raio tem acesso a toda a cena na memória. Assim, os programadores em tempo real precisam usar truques hacky para fazer coisas como reflexos e sombras, e o mesmo se aplica à iluminação global.
Um método de tempo de execução barato é usar mapas de luz cozidos, nos quais você executa algo lento, mas impressionante, como radiosidade ou rastreamento de caminho off-line primeiro e depois salva as informações de iluminação junto com os dados regulares de vértice. Isso é ótimo para geometria estática, mas se torna problemático assim que você adiciona objetos em movimento. Michal Iwanicki fez uma boa apresentação sobre como eles resolveram isso para 'The Last of Us'.
Harmônicas esféricas são muito usadas em mecanismos de jogos para representar luz indireta. Eles são basicamente uma transformação de Fourier na superfície de uma esfera. Ao descartar os componentes de alta frequência, você pode obter uma iluminação ambiente visualmente agradável, principalmente precisa, com apenas 9 coeficientes por cor. Unity, por exemplo, usa SH para assar 'sondas de luz' em vários pontos da cena; objetos em movimento podem interpolar entre sondas próximas para obter uma aproximação da luz indireta em sua posição. O artigo de Robin Green é basicamente a Bíblia sobre essa técnica, mas é bastante pesado.
A técnica mais popular no momento parece ser o Voxel Cone Tracing, que não envolve nenhuma etapa de pré-cozimento. Eu não estou muito familiarizado com isso sozinho, mas, pelo que entendi, isso envolve voxelizar sua cena em um mundo de baixa resolução no estilo Minecraft, colocando os voxels em uma estrutura espacial rapidamente percorrível como um octree e, em seguida, ampliando alguns raios (cones) de cada ponto e verificando quais voxels eles atingem para obter a iluminação refletida. A NVidia está pressionando isso bastante no momento, e há documentos aqui e aqui .
Espero que ajude :)
fonte
O rastreamento de caminhos é um algoritmo muito caro computacionalmente e não é adequado ao tempo real. A arquitetura do PBRT também não é adequada em tempo real; o principal objetivo do PBRT é resolver a equação de renderização, usando a integração imparcial de Monte Carlo. Consulte https://en.wikipedia.org/wiki/Unbeased_rendering para obter mais informações.
Sem muita otimização e restrições, duvido que você consiga atingir um desempenho decente em um dispositivo móvel.
Em qualquer caso, o rastreamento de caminho pode ser implementado no OpenGL, eu sugeriria examinar os shaders de computação que são muito poderosos. O OpenGL ES 3.1 suporta shaders de computação com algumas limitações menores, em contraste com o Desktop GL.
Leia esta página para obter mais informações: https://github.com/LWJGL/lwjgl3-wiki/wiki/2.6.1.-Ray-tracing-with-OpenGL-Compute-Shaders-(Part-I)
Boa sorte!
fonte