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.
Mapa da lama:
R16_UNORM
2048x2048
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 .
As faces do mapa cúbico do ambiente (albedo):
RGBA8_SRGB
Faces de um mapa do ambiente do cubo (normais):
RGBA8_UNORM
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.
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.
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.
Faces cozidas do mapa do ambiente do cubo (albedo):
BC3_SRGB
(AO cozido é armazenado no canal alfa)
Faces cozidas de um mapa do ambiente cúbico (normais):
BC3_UNORM
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 |
---|---|
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 |
---|---|
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 |
---|---|
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 |
---|---|
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 |
---|
RG16_FLOAT
: Este buffer contém a velocidade no espaço da tela para implementar o motion blur.
GBuffer 5 Depth |
GBuffer 5 Stencil |
---|---|
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 |
---|---|
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.
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.
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.
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.
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_FLOAT
ní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.