Análise dos gráficos de Red Dead Redemption 2

Um dos meus jogos favoritos, Red Dead Redemption , está de volta em 2018 com uma prequela de consoles. Foi lançado para PC em 2019 e finalmente consegui reproduzi-lo; Fiquei imediatamente impressionado com os gráficos dela. No entanto, fiquei desapontado: eu mal conseguia jogar em configurações médias com 25 FPS em uma GPU 1050Ti de mesa. Eu entendo, minha máquina não é muito poderosa, mas 25 FPS em configurações médias?



Hoje vamos ver vários exemplos de quadros do jogo e analisar as técnicas gráficas usadas no jogo.



Prefácio



Esta é uma análise não oficial do jogo. Acabei de analisar a captura de quadros com o RenderDoc . Se você quiser descobrir informações dos próprios desenvolvedores, pode estudar os slides do relatório no SIGGRAPH de Fabian Bayer . Slides (parte inferior da página), vídeo (começa às 1:58:00).



Você também pode ler a análise dos gráficos do GTA5, realizada por Adrian Correge [ tradução em Habré]. Como o RDR2 e o GTA5 foram criados pela mesma empresa e usam o mesmo mecanismo, alguns dos truques do GTA5 também estão presentes aqui.



Outro ponto importante é que eu não sou um programador de gráficos experiente e ainda sou um iniciante neste campo. Portanto, muito não está claro para mim. Se você encontrar bugs ou coisas que podem ser melhoradas,escreva para mim . Vamos lá!



Analisar o quadro



Aqui está o nosso principal quadro de análise:





O quadro foi capturado em um PC com configurações médias.



Em jogos como RDR2, é quase impossível explorar todos os truques em um quadro. Seu trabalho é transportado entre vários quadros. Portanto, capturei vários quadros, mas o mostrado acima será o principal. Ele contém muitas propriedades, incluindo: holofotes e holofotes, iluminação direcional (existem muito poucos deles, mas existem), edifícios, NPCs, cavalos, árvores, vegetação, nuvens, etc. Ele mostra a maioria das técnicas de renderização usadas no jogo.


O RDR2 é um jogo de mundo aberto, portanto o fluxo de dados é sempre feito. Portanto, a construção do quadro começa com um conjunto de tarefas, como criar e excluir texturas, exibir recursos de sombreador, visualizações de acesso aleatório, atualizar descritores, buffers, etc.



Mapa Terra / Lama



A sujeira desempenha um grande papel. Além de ser um mecânico de jogo, a sujeira torna o ambiente mais realista. O jogo transforma as texturas das trilhas humanas e dos cavalos em um mapa de deslocamento, juntamente com as texturas das trilhas da roda da carruagem. Essa textura acumulada é usada para o mapeamento de oclusão de paralaxe ao renderizar terreno.



MudMap


Mapa da lama: R16_UNORM2048x2048



Céu e nuvens



Após a aprovação do cálculo da sujeira, o jogo faz muito trabalho de computação da GPU. Eles se relacionam principalmente com o céu e as nuvens. Nuvens, nevoeiro e iluminação volumétrica são alguns dos efeitos mais importantes do RDR2. Você pode aprender mais sobre essa etapa nos slides de Fabian. Ele explica tudo isso com muito mais detalhes do que eu.



Mapa do ambiente



Os mapas de ambiente são a principal fonte de reflexões de RDR2, bem como o GTA5.

Como o GTA5 , o RDR2 gera um mapa de cubo de ambiente a partir da posição da câmera. O mecanismo de jogo gera um mapa de ambiente fino GBuffer semelhante ao usado no Far Cry 4 .



EnvironmentMapAlbedo


As faces do mapa cúbico do ambiente (albedo): RGBA8_SRGB



EnvironmentMapNormal


Faces de um mapa do ambiente do cubo (normais): RGBA8_UNORM



EnvironmentMapDepth


Bordas do cubo do ambiente (profundidade):D32S8



gerar mapas de cubo do ambiente em cada quadro pode ser uma tarefa muito complicada. O RDR2 usa otimizações para reduzir custos computacionais. Por exemplo, o jogo renderiza apenas objetos estáticos e opacos, realiza a seleção de frustum antes de renderizar cada face e as versões LOD mais baixas dos modelos. No entanto, descobri que o número de polígonos do terreno ainda é muito alto para mapas do ambiente.



Após a passagem do G-Buffer, um mapa do cubo do ambiente do céu é gerado usando um mapa do céu parabolóide e texturas de nuvens. O próximo passo é a convolução. Para iluminação baseada em imagem, o mecanismo RDR2 usa aproximação de soma dividida. Este método usa um mapa do ambiente pré-filtrado junto com um LUT do ambiente BRDF. Para a filtragem, o jogo recolhe o cubo do ambiente e armazena as versões recolhidas nos níveis de textura do cubo mip.



Antes de executar um passe de iluminação para um mapa de iluminação cúbico, o RDR2 processa uma oclusão ambiental de larga escala em outra textura cúbica. O jogo usa oclusão ambiental no espaço da tela, mas o SSAO ajuda apenas em pequenas escalas. A oclusão do ambiente cozido ajuda a realizar o escurecimento em uma escala maior, como terraços e interiores de escurecimento.



EnvironmentMapBakedAO


Bordas do cubo do ambiente (AO cozido):R8_UNORM



O jogo usa renderização de ladrilhos diferidos para calcular a iluminação dos mapas do ambiente . A seleção e a iluminação da luz são calculadas juntas em uma passagem do shader computacional para cada face do mapa do ambiente. (Obrigado a @benoitvimont por essa dica .) Também para iluminação cozida, o jogo usa uma técnica de mapa de luz mundial de cima para baixo semelhante ao Assassin's Creed III .



Para cada face do mapa do cubo, o RDR2 renderiza a cor final sobre a textura do ambiente do céu. Em seguida, o jogo filtra o mapa cúbico dos ambientes da mesma maneira que o mapa cúbico dos ambientes do céu.



EnvironmentMapFinal


Facetas do mapa do cubo do ambiente (final):R11G11B10_FLOAT



Além disso, quando o player está perto de um prédio, o RDR2 carrega mapas do ambiente localizados no interior dos edifícios. Também existem G-buffers de mapas de cubos que são transmitidos a partir do disco.



BakedEnvironmentMapAlbedo


Faces cozidas do mapa do ambiente do cubo (albedo): BC3_SRGB(AO cozido é armazenado no canal alfa)



BakedEnvironmentMapNormal


Faces cozidas de um mapa do ambiente cúbico (normais): BC3_UNORM



BakedEnvironmentMapDepth


Faces cozidas de um mapa do ambiente cúbico (profundidade):R16_UNORM



o jogo calcula a cobertura dessas cartas e as filtra, como as anteriores. Ele calcula apenas um mapa de ambiente cozido por vez e apenas o recalcula quando a hora do dia muda. Todos os mapas de ambiente são armazenados em uma matriz de mapas cúbicos de textura. Nenhuma conversão de um mapa de cubo em um mapa parabolóide duplo é executada.



G-Buffer Pass



Esta etapa começa com uma passagem preliminar das profundezas do terreno e, em seguida, o jogo renderiza a cena em G-Buffers.



GBuffer 0 RGB GBuffer 0 A
AlbedoTarget
AlbedoTargetA




  • RGBA8_SRGB- Este buffer contém o albedo nos canais RGB (cor base). Não entendo para que servem os dados do canal alfa, mas são usados ​​durante o estágio de anti-aliasing.




GBuffer 1 RGB GBuffer 1 A
NormalTarget
NormalTargetA


  • RGBA8_UNORM: Os canais RGB contêm normais e o canal alfa contém algo relacionado ao tecido e ao cabelo.




GBuffer 2 RGB GBuffer 2 A
MaterialTarget
MaterialTargetA


  • RGBA8_UNORM: Esse destino é usado para propriedades do material.

    • R: Refletância (f0)
    • G: Suavidade
    • B: Metálico
    • A: contém sombreamento (este canal será usado como uma máscara de sombra nas etapas subseqüentes)


GBuffer 3 R GBuffer 3 B
Material2TargetR
Material2TargetB


  • RGBA8_UNORM: o canal vermelho contém cavidades. Existem alguns dados misteriosos no canal azul novamente. E no canal alfa existem dados relacionados ao cabelo. Não encontrei nada no canal verde.


GBuffer 4 RG
MotionBlurTarget


  • RG16_FLOAT: Este buffer contém a velocidade no espaço da tela para implementar o motion blur.


GBuffer 5 Depth GBuffer 5 Stencil
DepthTarget
StencilTarget


  • D32S8: como GTA5, o RDR2 usa z inverso para profundidade , além de um buffer de estêncil para atribuir valores a um grupo específico de malhas.


Outro destino é gerado a partir dos dados armazenados:



GBuffer 6 R GBuffer 6 G
BakedAO
MysteryTarget


Esse buffer contém a mesma oclusão do ambiente cozido no canal vermelho que no estágio de mapa do ambiente. Mas existem outros canais nessa textura também. O canal verde contém dados semelhantes aos dados no canal azul do GBuffer 3. Novamente, não entendo para que esses dados são usados. Nos quadros capturados, não consegui encontrar nenhum dado nos canais azul e alfa. Vou estudar isso com mais detalhes.



Gerando mapas de sombra



Após o estágio G-Buffer, o jogo começa a renderizar mapas de sombras. Ele usa matrizes de textura 2D para mapas de sombra de fontes pontuais e matrizes de textura cúbica para mapas de sombra de fontes de holofotes.



Alguns jogos usam uma textura grande de atlas de sombra para os mapas de sombras ( como DOOM ). Uma das vantagens desse método é que o tamanho do mapa de sombra pode variar bastante, dependendo da distância. Ao usar matrizes de textura, essa flexibilidade é perdida porque todas as texturas na matriz devem ter o mesmo tamanho. O RDR2 possui três matrizes de textura diferentes para diferentes níveis de qualidade. Por exemplo, os holofotes têm:



  • 512x768 D16 para fontes distantes
  • 1024x1536 D16 ( — )
  • 2048x3072 D16 ( / )


As fontes pontuais projetam sombras em todas as direções. Para lidar com essa tarefa, os jogos usam uma técnica chamada Mapeamento de Sombra Omnidirecional , na qual a cena é renderizada em um mapa de profundidade do cubo a partir da posição da câmera. Usando esta técnica, as sombras do fogo e as sombras da lanterna de Arthur são renderizadas. Como os holofotes, os holofotes têm três matrizes diferentes para diferentes configurações de qualidade.



A maioria das fontes de pontos estáticos no jogo possui mapas de sombras de cubos.

Portanto, o jogo sempre que possível usa sombras cozidas e gera um mapa de sombras apenas quando o jogador está perto de um volume de luz. Mas é realmente ainda mais interessante.



A maioria das luzes da parede são holofotes, mas o jogo não gera um mapa de sombras omnidirecional para eles. Em vez disso, ele gera um mapa de sombra e copia a memória desse mapa de sombra na matriz de cubos do mapa de sombra de origem do ponto.





À esquerda, há um mapa de sombras de destaque de 1024x1536; à direita, estão os mesmos dados de imagem em um formato de textura de cubo de 512x512



Observe que os mapas z lineares armazenam z linear.


Isso explica por que os desenvolvedores não usaram um mapa de sombra quadrada para os holofotes. O número de pixels no mapa de sombras do foco e no mapa do cubo de origem de pontos deve ser o mesmo. Você pode ver que a imagem certa é cortada em pedaços. Isso ocorre porque a largura do mapa do spotlight e da sombra do ponto é diferente.



Observe também que essa textura não cobre 360 ​​graus. No entanto, felizmente, as fontes dos edifícios geralmente têm uma parede na parte de trás, e os mapas de sombras cozidos cobrem isso.



Outro ponto interessante é que o processo segue o contrário. Veja Saint Denis, por exemplo, uma das maiores cidades do jogo. O jogo gera mapas de sombras omnidirecionais para os holofotes e copia esses dados em uma variedade de mapas de sombras dos holofotes. Não sei por que o RDR2 faz o mapeamento de sombras dessa maneira. Não consegui encontrar nenhum truque na Internet.



A sobreposição de iluminação direcional de sombreamento no RDR2 é implementada quase da mesma forma que no GTA5 . É o Mapeamento de Sombra em Cascata com quatro cascatas. Cada bloco de 1024 x 1024 de uma textura de 1024 x 4096 (com configurações gráficas médias) é usado como uma cascata.



Shadowcascades


Atlas de sombras da iluminação direcional: R16_UNORM



Iluminação de palco



Finalmente, é hora de combinar todos esses mapas de ambiente, gbuffers, shadow maps e ao buffers.



Esta etapa consiste em duas passagens: a primeira para iluminação global (sol / lua), a segunda para fontes locais.



Passe de iluminação global



O jogo renderiza um quad em tela cheia para calcular a iluminação direcional, que é a luz da lua em nosso quadro. A iluminação assada também é usada no "mapa de iluminação mundial da vista superior" acima mencionado.



LightPass1


Passe de iluminação local



Neste passe, o jogo apresenta uma forma esférica baixa para volumes de fontes pontuais e um octógono para volumes de destaque. A iluminação é renderizada de trás para frente usando a mistura aditiva.



Para evitar chamadas desnecessárias ao shader, o jogo usa testes com profundidade limitada - um recurso adicional do OpenGL / D3D11, que se tornou nativo no Vulkan / D3D12. Ela também usa o teste de estêncil para descartar pixels que são absorvidos por objetos translúcidos, como painéis de janelas. Esses objetos serão renderizados durante uma passagem direta.



Lightpass2


Renderização de água e reflexões



Neste post, não vou falar sobre renderização de água, porque merece um post separado, mas vou falar um pouco sobre reflexões:



  • Como mencionado acima, os mapas do ambiente são a principal fonte de reflexões. Para reflexões padrão. por exemplo, para reflexões de janela, o jogo as usa.
  • Os espelhos são renderizados com reflexões planares, nas quais a cena é renderizada novamente a partir da direção da reflexão. Esse processo também é executado por renderização adiada.
  • As reflexões de água usam as reflexões do espaço da tela em combinação com um mapa de reflexão gerado no início do quadro.


Estágio de sombreamento direto



Uma das desvantagens do pipeline de renderização diferido é que não é possível renderizar adequadamente materiais translúcidos com GBuffers. Para resolver esse problema, o jogo renderiza materiais translúcidos de trás para frente usando sombreamento direto, como a maioria das renderizações adiadas.



Mas o acesso direto pode ser caro:



  • , .


, , , . ( ), .


  • .


, . - . - (, ) .


  • , .


Os estados do transportador devem ser alterados para poder alternar entre o corte das bordas frontal e traseira. E essas mudanças podem ser caras.


Nesse estágio, há outro destino de renderização gerado para o efeito de bloom. Esse alvo armazena o brilho da flor. Como você pode ver na imagem, objetos translúcidos são mais brilhantes.



BloomMask


Alvo brilho flor: R8_UNORM



Observe que o brilho da floração aumenta por longas distâncias, para que as áreas com neblina brilhem mais.


Pós-processamento



Nesse estágio, são executados suavização do tempo, floração, desfoque de movimento, efeito de profundidade de campo e outros efeitos. Pretendo dedicar uma postagem separada para o pós-processamento. Portanto, não discutiremos particularmente aqui, mas gostaria de dizer algumas palavras sobre a floração. Graças à iluminação volumétrica, basicamente o alvo de renderização já possui um brilho de fontes de luz.



A implementação de bloom no RDR2 é muito semelhante à implementação descrita em Pós-processamento de próxima geração em Call of Duty: Advanced Warfare .



  • O destino sem valores limite é considerado como entrada,
  • Renderize o R11G11B10_FLOATnível 7-mip de destino ,
  • Filtro bilinear de 13ª ordem para downsampling, filtro de barraca 3x3 para upscaling.


O jogo então combina esse alvo filtrado do efeito bloom com o alvo principal, bem como com o brilho alvo do bloom.



conclusões



Há muito mais a dizer, mas não quero que este post seja muito longo. Gostaria de compartilhar minhas descobertas sobre tudo isso, bem como algumas das curiosidades que descobri durante a análise.



  • , — . , . ( , .) bloom: - , , - , . GPU? ?
  • , RDR2 . , (, GBuffers). ? ?
  • : ( ) . SSAO, SSR, . target SSAO ?


Não me interpretem mal, não culpo ninguém (embora ... estou chateado com a baixa taxa de quadros), estou apenas tentando entender como essas decisões foram tomadas. Afinal, muitas pessoas trabalharam duro nesse jogo . Eles provavelmente não tiveram tempo suficiente para otimizar ainda mais o jogo.



Posfácio



Isso é tudo! O RDR2 é um jogo de ótima aparência, não apenas pelos gráficos utilizados, mas também pela arte e iluminação; tudo parece fenomenal. Eu me apaixonei pela paleta de cores deste jogo. Especialmente à noite, isso me lembra o quão covarde Robert Ford matou Jesse James, nenhum país para homens idosos e outros ocidentais de 35 mm.



All Articles