Resident Evil 2 renderização de quadro

imagem

Notas gerais


Todos os resultados foram obtidos em uma máquina bastante antiga (i7 3770 + GTX 770), o jogo rodou no DirectX 11 com qualidade média. Para análise, foram utilizados RenderDoc e Nsight.

O jogo roda no mecanismo Re Engine, que se tornou o herdeiro do MT Framework - o mecanismo da geração anterior de P&D da Capcom. Além do RE2, é usado no DMC5 e no RE7: Biohazard.

Como não encontrei materiais no RE Engine na Internet, tudo no artigo é baseado em suposições (espero, justificado). Examinei cerca de 90% da estrutura do quadro e dei uma descrição geral dos algoritmos. Pesquisas adicionais requerem mais experiência e tempo para shaders de engenharia reversa.

Estrutura do quadro


Simulação de partículas / fluidos


Entre outras coisas, o jogo gera texturas de ondas (um exemplo é tirado de outro quadro).

particle sim 0

particle sim 0

As ondas são usadas para renderizar água, que não está no quadro analisado.

Alguns resultados são copiados para o buffer temporário e isso sugere que os resultados podem ser usados ​​na CPU.

Cálculo da lista de fontes de iluminação


Esta passagem gera uma lista de fontes de luz visíveis, verificando a localização dos cones de iluminação em relação à pirâmide de visibilidade. Seu resultado é uma lista de fontes de luz visíveis e uma determinada tabela 3D comparando posições no espaço de visualização com as fontes de luz correspondentes.

Também são calculadas listas de instâncias visíveis para cada fonte de luz, que são usadas posteriormente ao atualizar o mapa de sombras.

Ponto branco


Esta passagem constrói um histograma de luminância com base na imagem HDR anterior e na tabela de medidas. Então, com base nesses dados, ele determina o ponto branco.

mesa de medição

prevhdr

Definição de objetos sobrepostos


A caixa delimitadora dos objetos sobrepostos é verificada quanto à interseção com a pirâmide de visibilidade no sombreador computacional e o buffer de argumentos indiretos é preenchido.

Soltar geometria sobreposta


Os objetos sobrepostos são renderizados no buffer de profundidade de baixa resolução e, em seguida, a caixa delimitadora é verificada quanto à entrada de profundidade nesse buffer.


Amostras 0-3

O buffer de profundidade usado é multisampled quatro vezes. Provavelmente para compensar a baixa resolução.

seleção de oclusão 0

Parece caixas delimitadoras orientadas em relação ao olhar.

seleção de oclusão 0

Um exemplo de teste de geometria sobreposta (de outro quadro). Os pixels que passam no teste (verde) gravam um sinalizador (por exemplo 1) no buffer de visibilidade de cada instância.

store_raw RWDrawIndirectArguments.x, v1.x, l(1) 

Acumulação de argumentos indiretos


Quase todo objeto de geometria no espaço do mundo é renderizado usando uma chamada de desenho indireta. O criador de perfil Nsight mostra as chamadas para NvAPI_D3D11_MultiDrawIndexedInstancedIndirect. Para informações sobre seu uso, consulte [ 1 ] e [ 2 ]. O RenderDoc bloqueia a extensão MultiDraw, portanto, no EventBrowser, eles são expandidos para muitos DrawIndexedInstancedIndirect e alguns deles estão vazios.

O objetivo desse passe é coletar máscaras de visibilidade do passe anterior e gerar um buffer de argumento.

Passagem de profundidade


Nada fora do comum. Um subconjunto de uma cena com geometria básica sobreposta.

prepass de profundidade

Geometria + decalques da passagem do buffer G



Dados de saída:

  • RT0 - emissivo r11g11b10
  • RT1 - rgba8 albedo.rgb + metallness.a
  • RT2 - r10g10b10a2 normal.rg + rugosidade.b + misc.a
  • RT3 - r16g16b16a16 cozido_ao.x + velocidade.yz + sss.a


Os modelos renderizados usam oclusão de ambiente cozido de modelos de alta resolução.

Cálculo HiZ


Hiz gif

Um sombreador computacional de múltiplas passagens define cada nível na hierarquia de profundidade.

Ao


Processamento SSAO ou HBAO +, dependendo dos parâmetros escolhidos pelo player. No meu caso, SSAO.

AO é calculado com base em HiZ do passe anterior.


Especular global + difuso


Usando algum algoritmo não trivial, sondas de luz, mapas cúbicos e AO são combinados em mapas globais difusos e especulares.

Gid

Gid

Exemplos de cartões cúbicos da cena.

Gid

O componente difuso da iluminação global.

Gis

Componente da iluminação global especular.

Atualização do Mapa Sombra


Os mapas de sombra criados para cada fonte de luz são atualizados para as fontes afetadas por objetos dinâmicos. Cada mapa de sombra é colocado em uma grande variedade de texturas.


Especular local + Difuso + SSS


Em seguida, é calculada a contribuição de cada fonte de luz para os componentes especulares e difusos.

Gid

Difuso + SSS. Os efeitos do SSS não são visíveis nesse quadro.

Gis

Especular do componente.

Integração de iluminação



Os componentes de luminosidade especular / difusa / iluminação local integram-se ao albedo.

Adicionando vidro transparente



Depois de adicionar todas as fontes de luz, o vidro transparente é renderizado.

Iluminação volumétrica / de neblina / cálculo de fumaça



Na verdade, é apenas um monte de sprites.

Aplicar iluminação volumétrica / de nevoeiro / fumaça



Esta passagem calcula uma imagem tremida para melhorar a iluminação do nevoeiro.


Se você substituir a máscara de nevoeiro original por um padrão quadriculado.

Gis

O resultado desta passagem.

TAA com imagem HDR anterior


Gis

TTA é apenas mágica.

Desfoque de movimento


Gis

Com base no mapa de velocidade, um mapa auxiliar de desfoque é calculado.

Gis

Pós-processamento


Gis

Este passe primeiro diminui o zoom na imagem.

Gis

E então aplica um filtro de bloom, correção de tom, distorção e aberração cromática.

Conclusão


O mecanismo usa ativamente sombreadores computacionais + renderização indireta. Todas as malhas e texturas são de alta qualidade.

O jogo usa renderização diferida com TAA / FXAA e vidro como pós-processamento. Você pode ler mais sobre truques com renderização diferida aqui [uma postagem baseada em um artigo sobre Habré]. Muitas texturas são compactadas pelo BC7. Em geral, as técnicas utilizadas são semelhantes às descritas em [ 4 ].

Bónus


Contribuição SSS


Gis

Eu tive que procurar cuidadosamente um quadro adequado para mostrar o impacto do SSS.

Como um monstro com tentáculos é renderizado


Forma final do vírus G

O monstro é dividido em várias partes.

Guts



O jogo tem muitas texturas sangrentas para vários detalhes.

Os níveis de mip para texturas não são apenas filtrados linearmente. Em cada nível, a nitidez é aprimorada. Além disso, algumas texturas já possuem destaques especulares (não está muito claro como isso afeta sua aparência final).

Geometria


Forma final do vírus G

A geometria tem uma boa topologia.

HBAO


Forma final do vírus G

O HBAO oferece qualidade muito melhor que o SSAO.

Fumaça



A fumaça considera fontes de luz cônicas.


Aviões reais são usados ​​para renderizar fumaça.

Referências


[1] Kostas Anagnostou: experimentos em seleção de oclusão baseada em GPU

[2] Daniel Rákos: Multi-Draw-Indirect está aqui

[3] Adrian Correger Blog

[4] Alien: isolamento

Source: https://habr.com/ru/post/pt462443/


All Articles