
Horários do dia que mudam dinamicamente, efeitos climáticos variados e muitos biomas exploráveis tornam o rastreamento de raios em tempo real uma ótima escolha para The Riftbreaker
Um rápido tour pelo rastreamento de raios
O mundo do The Riftbreaker é completamente dinâmico e destrutível. Quase todos os objetos presentes no ambiente podem ser influenciados pelo jogador. A vegetação pode ser dobrada, queimada e dissolvida. Milhares de criaturas podem se aglomerar ao redor do jogador e preencher completamente a tela. Esse tipo de jogo requer uma abordagem especial para renderizar sombras totalmente dinâmicas.
Anteriormente, para gerar sombras no mecanismo Schmetterling 2.0, eles usavam o método de mapa de sombra em tempo real (sem os próprios mapas de sombra pré-calculados). Esta solução foi a mais ideal devido à geometria totalmente dinâmica da cena. Porém, não foi possível usar nenhum mapa de luz pré-computado, pois eles não se ajustavam exatamente a esta geometria. É por isso que os mapas de sombras dinâmicos foram a única solução real por muito tempo. Embora sejam amplamente usados em toda a indústria, eles têm uma série de limitações.

Fragmento da batalha do chefe. Anexado ao ressalto está uma luz pontual lançando sombras que adiciona fidelidade visual à cena.
As últimas gerações de GPUs são poderosas o suficiente para realizar cálculos de traçado de raio em tempo real. E o advento de novas placas gráficas permitiu ao estúdio finalmente introduzir sombras traçadas por raios que fornecem resultados superiores aos métodos tradicionais de mapeamento de sombras.
O princípio básico do traçado de sombra é que não olhamos a cena do ponto de vista da fonte de luz e não procuramos todos os tipos de castas de sombra, como é feito nos mapas de sombra. O rastreamento de raios permite que você simplesmente dispare raios em uma fonte de luz. Se o feixe atingir um obstáculo, não haverá iluminação direta dele. Se atingir a fonte de luz, nenhuma sombra será adicionada. Este algoritmo é bastante simples, mas fornece excelentes resultados e oferece soluções para problemas comuns de renderização de sombras. No entanto, é muito exigente quanto ao desempenho da GPU.

Cada elemento da geometria dinâmica da cena pode lançar uma sombra. O desafio era fazer com que essas sombras parecessem o mais precisas possível, mantendo o desempenho.
Adicionar uma tecnologia de renderização completamente nova ao seu motor de jogo não é uma tarefa fácil. No caso de The Riftbreaker, a colaboração do estúdio com a AMD ajudou muito. Eles forneceram uma biblioteca GPUOpen RT Shadows proprietária contendo soluções de rastreamento de raio e redução de ruído para limpar os resultados da passagem de rastreamento de raio. No entanto, antes de usar esta biblioteca, tive que desenvolver um renderizador DirectX 12 para o motor de jogo. A razão para isso foi a API DirectX Raytracing (também conhecida como DXR) introduzida no padrão DirectX 12 Ultimate. Esta API permite novos sombreadores e recursos de rastreamento de raio de hardware de GPUs modernas.

The Riftbreaker . .
Outra vantagem de trabalhar com a AMD é o código-fonte aberto de suas soluções. Isso permite a implementação de tecnologia compatível com as plataformas de jogos mais recentes do mercado, incluindo consoles de última geração. Também é importante notar que a compatibilidade da plataforma influenciou a seleção e renderização da API. Duas opções foram consideradas: Vulkan e DirectX 12. Embora Vulkan inclua rastreamento de raio, esta API não está disponível no Xbox ou PlayStation e, até o momento, apenas a Nvidia a suporta no PC. A mudança para DirectX 12 traz suporte nativo de rastreamento de raios para PCs Xbox e Windows, permitindo que você use hardware de qualquer fabricante.

Conforme as condições climáticas mudam, a sombra parcial também muda. Neste exemplo, você pode ver como as sombras ficam mais suaves quando chove e mais nítidas quando a luz do sol aparece.
Os benefícios da implementação de sombras rastreadas por raio podem variar dependendo do cenário de implementação. No caso do The Riftbreaker, os recursos mais importantes são:
- Resolução de sombra "infinita": a qualidade da sombra não depende da distância do assunto à câmera, ao contrário dos métodos tradicionais de mapeamento de sombra. Cada pixel na tela tem sombreamento calculado individualmente, resultando em sombras mais precisas e estáveis sem artefatos cintilantes.
- Mudança de penumbra: as sombras rastreadas simulam dinamicamente situações como a transição de um céu nublado com chuva para um meio-dia claro.
- baixo custo de cálculo de fontes de luz adicionais que projetam sombras. Com a implementação atual de sombras traçadas por raios no The Riftbreaker, você pode calcular até 4 luzes de projeção de sombra simultaneamente sem degradação significativa do desempenho. O custo de adicionar luzes adicionais no caso de mapas de sombras é muito maior.
Todos esses benefícios vêm à custa de uma perda significativa de desempenho. Mesmo com as GPUs mais recentes que suportam traçado de raio acelerado por hardware, os valores de FPS com todos os efeitos de traçado de raio habilitados podem ser até a metade ao comparar a mesma cena sem traçado de raio.
Implementando sombras traçadas por raios
Adicionar sombras traçadas por raios a uma cena é um processo complexo que resulta em um mapa extremamente detalhado de pixels iluminados e apagados. Durante a primeira passagem do traçado de raio, é necessário restaurar a posição de todos os pixels na área visível da tela e direcionar os raios desses pixels para todas as fontes de luz que os afetam. Essas coordenadas são obtidas do buffer de profundidade. Se o feixe atingir a fonte de luz, a superfície será iluminada diretamente. Se o feixe atingir um obstáculo em seu caminho, a superfície ficará sombreada. Além disso, para otimizar o processo, todos os raios de superfície são lançados com mapas normais voltados para longe da fonte de luz. A próxima passagem define o tipo de sombreador que será aplicado à interseção do raio e da superfície. DXR API usa shader para processamento,com base no resultado do traçado de raio e o compara com a tabela de sombreamento existente.

Um exemplo de cena de jogo com traçado de raio - sombras suaves e oclusão de ambiente habilitadas. As
placas gráficas da série Radeon RX 6000 usadas para desenvolver traçado de raio no Riftbreaker são poderosas e capazes de disparar milhões de raios por segundo. No entanto, ainda mais informações são necessárias para se ter uma ideia precisa de como a luz se comportará no mundo do jogo. No caso de renderização offline, isso geralmente significa lançar milhares de raios em todas as direções para cada pixel. Nenhum hardware moderno é capaz de realizar esses cálculos em tempo real, muito menos fazê-lo 60 vezes por segundo. Portanto, você precisa de alguma forma criar um mapa de sombras preciso usando dados incompletos.

. , .
A falta de dados precisos cria muitos problemas e pode levar à degradação da qualidade visual da cena. Embora tenhamos a maioria das informações necessárias para renderizar objetos, detalhes como caminhos, bordas e sombras suaves serão borrados e misturados uns com os outros. Um número limitado de feixes por quadro resulta em sombras ruidosas. Em seguida, outra biblioteca de GPU de código aberto entra em ação - o FidelityFX Denoiser da AMD. Remover o ruído é um processo complexo que se tornou possível graças ao uso generalizado de métodos temporais que analisam os quadros anteriores e os combinam em um novo. AMD NR permite determinar rapidamente a média dos dados disponíveis e quais propriedades aplicar a um determinado pixel para obter uma imagem nítida sem qualquer comprometimento visível.

A mesma cena depois de remover o ruído

, . .
É claro que a implementação de sombras com traçado de raio acabou não sendo uma tarefa tão fácil nos limitarmos a usar algumas bibliotecas prontas. O Riftbreaker apresenta seus próprios desafios únicos que requerem soluções específicas.
O primeiro problema foi o grande número de objetos dinâmicos presentes no mundo do jogo. Em The Riftbreaker você assume o papel de um cientista explorando um exoplaneta habitado por inúmeras espécies exóticas da flora e da fauna. O jogador é atacado de vez em quando por hordas de milhares de criaturas alienígenas. Cada um deles deve lançar sua própria sombra. Combinado com um sistema de vegetação dinâmico que responde ao vento, ondas de choque e forças de flexão aplicadas por outros objetos, isso se tornou um grande problema de otimização.

Milhares de entidades interagem umas com as outras em tempo real.
O principal problema foi causado pela forma como a estrutura de aceleração superior para traçado de raios processa os dados. Esta estrutura armazena informações sobre os objetos na cena que são usados durante a passagem de traçado de raio. Esses dados só podem ser armazenados como uma estrutura de aceleração de nível inferior predefinida que contém informações sobre os vértices do objeto. Isso não é um problema quando se trata de rochas ou edifícios, mas todas as unidades com esqueleto, animações combinadas dinamicamente e vegetação dinâmica estão completamente fora de sintonia com a suposição de dados predefinidos.

«» . , . : , .
Para fornecer à estrutura de aceleração todos os dados necessários, alguns passos sérios tiveram que ser dados. Cada objeto dinâmico na cena é individualmente incorporado em um modelo estático completamente novo que pode ser processado durante a passagem de traçado de raio. Para manter a precisão, este processo deve ser repetido a cada quadro. A complexidade desta tarefa é adicionada pelo fato de que The Riftbreaker tem um sistema meteorológico dinâmico. Por causa disso, é possível que a fonte de luz esteja em um ângulo, devido ao qual o objeto projeta uma sombra no quadro, sem ser diretamente visível. Isso significa que durante o processo de cozimento, é necessário levar em consideração não apenas os objetos na parte visível da tela, mas também fora dela.

Toda a estrutura de aceleração é renderizada em apenas um quadro de renderização.
O processo de preparação das estruturas de aceleração é muito complicado em termos de cálculos de CPU e pode facilmente se tornar um gargalo para todo o renderizador. O Schmetterling Engine 2.0 reduz a carga na unidade de processamento central paralelizando intensamente todos os processos necessários para preparar uma cena para traçado de raio. Ao distribuir as operações entre a CPU e a GPU, foi possível encontrar a potência computacional necessária para realizar todas essas operações em cada quadro. No caso de um cenário de teste que inclui cerca de 6.000 criaturas atacando a base do jogador, foi possível reduzir o tempo de renderização de 60 ms para 17 ms paralelizando tarefas dependentes de CPU (usando uma CPU AMD Ryzen 9 3900X e uma versão de pré-lançamento do Radeon 6800XT).

The Riftbreaker. , , , .
-
Outro desafio único que os engenheiros tiveram que resolver ao implementar técnicas de rastreamento de raios no Riftbreaker acabou por estar relacionado ao sistema de vegetação, embora de uma forma ligeiramente diferente. As texturas usadas pela folhagem são geralmente testadas para alfa e geralmente apresentam áreas transparentes. No entanto, para o raikast, não importa. Assim que o raio atinge um pixel transparente na textura, ele retorna o "toque" normal. Isso não significa necessariamente que o pixel a partir do qual estamos produzindo os raios deve ser coberto com sombra, porque se o texel que atingimos for transparente, o raio deve continuar a se mover em direção à fonte de luz. Existem muitas dessas texturas no jogo, então foi necessário encontrar uma solução para este problema e adicionar suporte para teste alfa ao sombreador AnyHit.

- . , .
A abordagem do estúdio foi usar uma solução usada em técnicas tradicionais de renderização. Ao atingir a superfície, obtemos as coordenadas baricêntricas do triângulo no ponto de intersecção. Essas coordenadas não são suficientes para determinar em qual pixel da textura o raio atingiu, e você só pode descobrir a posição do ponto de interseção no triângulo. No entanto, nesta fase, podemos determinar quais picos devem ser considerados. Cada vértice do triângulo possui um conjunto de coordenadas UVW atribuídas a ele pelo designer gráfico durante a texturização. Sabendo em qual triângulo caímos, as coordenadas da interseção dentro desse triângulo e que parte da textura deve cobri-lo, podemos realizar um teste alfa.

Os polígonos sob as texturas da vegetação são opacos aos raios. Tive de introduzir um método adicional para verificar se eles se encaixavam na textura que era realmente opaca.
No entanto, antes de tudo isso acontecer, a estrutura de aceleração precisa passar informações sobre as texturas e suas posições. Para isso, precisamos de uma tabela de sombreadores, que é essencialmente um banco de dados para a GPU. Ele lista as texturas usadas na cena e os valores atribuídos a elas nos buffers de índice e vértice. Com a tabela de sombreamento, você pode obter rapidamente todos os dados de modelo e textura de que precisa para concluir as etapas de sombreamento subsequentes.

Como The Riftbreaker se passa em um mundo alienígena desabitado, muitos animais selvagens podem ser encontrados aqui
Se o resultado for “opaco”, os dados de sombreamento são aplicados e o processo termina para aquele raio específico. Em caso de acertos opacos, um teste alfa é executado. Como já mencionado, quando um raio cruza uma superfície, a partir daqui você pode obter as coordenadas baricêntricas do ponto do triângulo com o qual ele colidiu. Conhecendo essas coordenadas e referindo-se ao buffer de índice, você pode obter os índices dos vértices do triângulo especificado. Isso recupera as coordenadas UVW. Com os dados fornecidos pelo buffer de índice, agora você pode encontrar informações no buffer de vértices sobre onde esses vértices caem na textura. Só depois de todas essas ações é que obtemos uma resposta à pergunta se o raio colidiu com uma superfície opaca ou transparente. Se o valor alfa no ponto de interseção estiver abaixo do limite de transparência, o raio continua a interceptar a cena.

Dessa forma, obtemos o resultado exato em cada quadro. Clique na imagem para ampliá-la.
O teste alfa aumenta o custo do material em termos de computação de sombra traçada por raio em relação aos métodos tradicionais, portanto, é melhor evitá-los sempre que possível. Em um cenário de selva, o custo de enviar esse feixe é cerca de 20% maior do que o de um feixe atingindo um objeto opaco. Para reduzir o número de raios que atingem superfícies transparentes, são necessárias otimizações, limitando a área de superfície de todos os objetos transparentes. A visão da câmera no The Riftbreaker é isométrica, então o número de polígonos visíveis ao mesmo tempo é naturalmente limitado, e podemos facilmente aumentar o tempo de renderização do polígono da maioria dos objetos sem afetar o desempenho da GPU.
Conclusão
O uso do traçado de raio pelo Riftbreaker só trouxe benefícios. O mundo do jogo tornou-se mais crível, o que contribui para uma melhor imersão. Os pequenos detalhes adicionados com o traçado de raio definitivamente ajudam a melhorar a percepção. Ver um cometa brilhante no céu projetando sombras em objetos dinâmicos na Terra é uma visão verdadeiramente bela. Os dias nublados, por sua vez, saúdam o jogador com sombras suaves e uma paleta de cores mais suave. O Riftbreaker certamente ocupará seu merecido lugar na programação de jogos da próxima geração.

O Riftbreaker está chegando ao PC e consoles em 2021.