
Introdução
Doom Eternal não precisa de introdução separada: é um sucessor direto do Doom 2016, desenvolvido graças à sétima iteração da id Tech, o motor interno da id Software. Ao mesmo tempo, fiquei impressionado com a alta qualidade do componente visual do Doom 2016 e a simplicidade e elegância das soluções técnicas. Nesse aspecto, Doom Eternal supera seu antecessor em muitas áreas, e algumas delas merecem uma análise detalhada. Neste artigo analítico, tentarei discutir todos eles.
Minha análise é inspirada pelo duro Adrian Courrèges sobre Doom 2016 ( tradução) Em minha opinião, esses trabalhos fornecem um vislumbre de abordagens para resolver alguns dos problemas de renderização de projetos AAA e, portanto, tornam-se excelentes materiais de ensino. Nesta análise, pretendo discutir os recursos gerais e não me aprofundar muito nas complexidades de cada método de renderização e aprovação. Além disso, algumas das passagens em Doom Eternal são quase idênticas às suas contrapartes em Doom 2016 e já foram desmontadas no trabalho de Adrian Courrèges, então posso pulá-las.
Gostaria de marcar de forma especial o ensino estritamentea natureza do artigo atual. Eu não endosso de forma alguma a engenharia reversa de produtos com o propósito de roubo de propriedade intelectual ou outra intenção maliciosa. Se você ainda não jogou Doom Eternal, não precisa se preocupar: eu só falei sobre o início do jogo, então você não corre o risco de spoilers.
Então vamos começar.
Com o lançamento do id Tech 7, a transição do mecanismo de OpenGL para a API Vulkan permitiu que os desenvolvedores trabalhassem de forma mais eficaz com os recursos da geração atual de GPUs, como recursos sem vínculo.
Um quadro em Doom Eternal

Acima podemos ver uma seção do jogo perto do início: um interior com vários oponentes e iluminação volumétrica. Por analogia com seu predecessor, o processo de renderização em Doom Eternal é responsável pela renderização direta , mas se Doom 2016 for forçado a renderizar junto com G-buffering de superfícies reflexivas, em nosso caso o buffer não é usado e a renderização assume todas as tarefas.
Afastando-se das mega-texturas
Com o lançamento do jogo Rage, criado na engine id Tech 5, o mundo conheceu o conceito de implementação de texturas chamadas de “mega texturas”. Este método é usado no Doom 2016 e para cada quadro ele renderiza uma chamada "textura virtual" com informações sobre texturas visíveis. A textura virtual é analisada no próximo quadro para determinar quais texturas devem ser carregadas do disco. No entanto, as megatexturas têm um problema óbvio: assim que a textura entra no campo de visão, é tarde demais para carregá-la, de modo que a textura parece borrada nos primeiros quadros após aparecer. Com o lançamento do id Tech 7, os desenvolvedores abandonaram esse método.
Skinning through the GPU
Normalmente, mesmo antes de renderizar qualquer textura e sombreamento, o sombreador de vértice avalia o esférico. O skinning id Tech 7 é executado antecipadamente por um sombreador computacional com a gravação dos vértices resultantes no buffer. Graças a essa abordagem, o sombreador de vértice não precisa mais de dados de skinning e, como ele não é mais executado em cada passagem de geometria, como resultado, as trocas de sombreador acontecem com menos frequência.
A principal diferença entre o skinning em um sombreador de computação e um sombreador de vértice é gravar o resultado em um buffer intermediário. Tal como acontece com o sombreador de vértice, para cada vértice, o thread de sombreador de computação recebe uma transformação de cada osso que afeta o vértice. Em seguida, ele muda a posição do vértice com cada transformação do osso e soma todas as novas posições de acordo com o peso das películas armazenadas no vértice. Como resultado, o sombreador de vértice pode usar o resultado do buffer para interpretá-lo como uma malha estática.
O link fornece um excelente artigo sobre Compute Shader Skinning de János Turánszki.
Também é útil observar que Doom Eternal usa um tipo interessante de cache - Alembic Cachecomparável a vídeo reproduzível altamente compactado. Esses caches armazenam animações preparadas para serem emitidas e expandidas durante a execução do programa. Citando a análise técnica da Digital Foundry , Alembic Cache é aplicado a uma ampla gama de animações, desde cenas cinematográficas em grande escala até pequenos tentáculos no chão. Essa abordagem é especialmente conveniente para animações com complexidades de implementação por meio de animação de pele, por exemplo, para simulação de orgânicos e tecidos. Se você está interessado nesta tecnologia, recomendo que você confira a apresentação Axel Gneiting na Siggraph 2014 .
Mapas de sombra
A próxima etapa é a renderização de sombras e, à primeira vista, a id Tech 7 e sua abordagem predecessora para gerar seus mapas não é diferente.
Como você pode ver abaixo, as sombras são renderizadas em uma grande textura com uma profundidade de 24 bits e um tamanho de 4096 por 8196 pixels, variando em qualidade em alguns lugares. A textura não muda entre os frames, e de acordo com a apresentação "Devil is in the Details" na Siggraph 2016, a geometria estática é armazenada em cache no mapa de sombras para evitar o redesenho para cada quadro. A ideia em si é simples: não precisamos atualizar as sombras até que haja movimento na frente da fonte de luz e, portanto, podemos declarar um mapa de sombras "em cache": um mapa regular com geometria estática, uma vez que assumimos que a geometria não muda ... Se um objeto dinâmico se move no cone de visualização, o mapa de sombras "em cache" é copiado para o principal e a geometria dinâmica é redesenhada em cima dele. Esta abordagem permite não redesenhar a cena inteira no cone de visão sempre que ela é atualizada. Naturalmente, se a luz mudar, toda a cena terá que ser redesenhada do zero.
A amostragem 3x3 PCF é usada para suavizar as bordas das sombras durante a amostragem do mapa. Como a luz solar geralmente cobre uma parte significativa do ambiente, mapas de sombras em cascata são usados para distribuir melhor a qualidade.
Por exemplo, dê uma olhada no atlas de mapas de sombras. Quanto mais significativa for a luz, quanto maior for a área na tela ou quanto mais próximo o objeto estiver da câmera, maior será o segmento selecionado do atlas - isso é necessário para obter mais detalhes. Essas heurísticas são avaliadas dinamicamente.

Velocidade de profundidade e pré-passagem
Começando com a arma do jogador, as geometrias opacas, estáticas e dinâmicas são renderizadas sequencialmente para a profundidade do alvo. Normalmente, para não fazer cálculos desnecessários de sombreadores de pixel em uma interseção potencial de geometrias, uma passagem preliminar de processamento de profundidade é realizada com a adição do resultado ao buffer. Visto que redesenhar pixels quando eles se cruzam cria recálculos desnecessários e, em última análise, afeta negativamente o desempenho, a importância dessa abordagem torna-se inestimável. Com a pré-passagem de profundidade, um sombreador de pixel de iluminação direta pode eliminar pixels extras, comparando-os a um buffer de profundidade antes do cálculo real, economizando recursos valiosos.

Armas do jogador,

objetos estáticos, objetos

dinâmicos
Na pré-passagem, não apenas a profundidade é renderizada, mas também a cor de destino. Na geometria dinâmica, a velocidade é renderizada por meio de vetores de movimento, ou seja, a posição da posição atual subtraída da posição do pixel no quadro anterior. Como o movimento é armazenado nos canais vermelho e verde do alvo de renderização de ponto flutuante de 16 bits, só precisamos saber o movimento X e Y. Essa informação é então usada no pós-processamento para aplicar desfoque e re-projeção de anti-aliasing temporal. A geometria estática não precisa de vetores de movimento, já que ela "se move" apenas em relação à câmera e seu movimento pode ser calculado a partir do movimento da própria câmera. Como você pode ver na imagem abaixo, não há muito movimento em nossa cena.

Profundidade hierárquica Z
A próxima etapa é gerar uma cadeia mip de buffer de profundidade hierárquica: essa cadeia é semelhante a um mip-map, mas em vez de calcular a média de quatro pixels adjacentes, leva seu valor máximo. Essa abordagem é frequentemente usada em gráficos para uma variedade de tarefas, como acelerar reflexos e descartar geometria obstruída. No nosso caso, a corrente mip está descartando iluminação e decalques, sobre os quais falaremos mais tarde. Recentemente, a geração de mip foi realizada em uma passagem, com gravação em vários mip-s de uma vez, mas em Doom Eternal, a gravação ainda é realizada separadamente para cada mip.

Decalques de malha
Até agora, não tivemos tempo de nos familiarizar com as principais diferenças entre os processos em Doom Eternal em comparação com Doom 2016, mas os decalques da grade se encaixam nesta categoria. Estes são pequenos decalques (parafusos, grades, saliências) que, como decalques regulares, podem afetar qualquer propriedade da superfície (normal, rugosidade, cor). No entanto, um decalque de grade típico é atribuído pelos artistas durante o desenvolvimento da grade e, ao contrário da colocação padrão de decalques no ambiente, pertence à sua própria grade. O Doom dependia muito de decalques no passado, e a mudança atual para decalques em malha apenas aumentou o detalhe e a flexibilidade dos gráficos.
Para obter esse benefício, a próxima passagem de geometria renderiza os IDs de cada decalque em uma textura de oito bits. Além disso, ao aplicar sombras, provamos a textura e, por meio dos identificadores, obtemos a matriz de projeção associada a cada chamada para desenhar. A matriz projeta coordenadas de pixel do espaço mundial para o espaço de textura e, em seguida, essas coordenadas são usadas para obter uma amostra do decalque e mesclá-lo com o material da superfície. Essa técnica é incrivelmente rápida em sua execução e abre um amplo escopo para os artistas trabalharem com uma variedade de decalques. Como os IDs são renderizados em uma textura de 8 bits, pode haver potencialmente até 255 decalques em uma única malha.
A única condição para tudo isso é que todas as texturas de decalque sejam vinculadas a processos ao renderizar malhas. Com um processo de renderização completamente não relacionado, os desenvolvedores podem vincular todas as texturas de decalque de uma vez e indexá-las dinamicamente no shader. Uma vez que os desenvolvedores usam esse método para implementar mais alguns truques no jogo, falaremos mais sobre o processo de renderização não relacionado posteriormente.
Abaixo podemos ver a malha de textura do decalque. Para facilitar a visualização, os identificadores são coloridos em cores diferentes.

Jogando luz e decalques
A luz em Doom Eternal é totalmente dinâmica e até várias centenas de fontes podem atingir o campo de visão ao mesmo tempo. Além disso, como observamos anteriormente, os decalques no jogo são de grande importância, por exemplo, no mesmo Doom 2016, o número de decalques ultrapassou milhares. Tudo isso requer uma abordagem especial para descartar o excesso, caso contrário, o desempenho não resistirá à gravidade dos pixel shaders.
O Doom 2016 usou uma versão baseada em processador de rejeição de luz de cluster: a luz e os decalques foram coletados em "froxels" em forma de cone, que foram lidos durante o sombreamento determinando o índice do cluster a partir da posição do pixel. O tamanho de cada cluster era de 256 pixels e foi dividido logaritmicamente em 24 segmentos para manter a forma quadrada. Essa técnica foi logo adotada por muitos outros desenvolvedores, e métodos semelhantes são encontrados, por exemplo, em Detroit: Torne-se Humano e Justa Causa.
Com o número crescente de fontes de iluminação dinâmica (centenas) e decalques (milhares), o clustering da CPU do elenco de iluminação não foi suficiente em Doom Eternal, pois os voxels estavam ficando muito grosseiros. Como resultado, os desenvolvedores criaram uma abordagem diferente para id Tech 7 e, por meio de shaders computacionais executados em vários estágios, eles criaram um rasterizador de software. Primeiro, os decalques e a luz são ligados em um hexaedro (hexágono) e transferidos para um rasterizador computacional, de onde os vértices são projetados no espaço da tela. Em seguida, um segundo sombreador de computação apara os triângulos nas bordas da tela e os monta em blocos de 256 por 256 pixels. Ao mesmo tempo, por analogia com o descarte de aglomerados, elementos individuais de fontes de luz e decalques são registrados em froxels,após o qual o próximo sombreador computacional executa um procedimento semelhante para blocos de 32 por 32 pixels. Em cada bloco, os elementos que passam no teste de profundidade são marcados em um campo de bits. O sombreador computacional final traduz os campos de bits em uma lista de luzes que são eventualmente usadas na passagem de luz. Curiosamente, os índices de elemento ainda são registrados em froxels tridimensionais de 256 por 256 pixels, semelhante à abordagem de cluster. Em locais com uma interrupção significativa em profundidade, o valor mínimo da nova lista de luzes e da lista antiga de fontes agrupadas é comparado para determinar o número de luzes em cada ladrilho.que são finalmente usados no passe de iluminação. Curiosamente, os índices de elemento ainda são registrados em froxels tridimensionais de 256 x 256 pixels, semelhante à abordagem de cluster. Em locais com uma interrupção significativa em profundidade, o valor mínimo da nova lista de luzes e da lista antiga de fontes agrupadas é comparado para determinar o número de luzes em cada ladrilho.que são finalmente usados no passe de iluminação. Curiosamente, os índices de elemento ainda são registrados em froxels tridimensionais de 256 x 256 pixels, semelhante à abordagem de cluster. Em locais com uma interrupção significativa em profundidade, o valor mínimo da nova lista de luzes e da lista antiga de fontes agrupadas é comparado para determinar o número de luzes em cada ladrilho.
Se você não lidou com a rasterização tradicional, uma descrição tão rica pode não ser clara para você. Se você quiser mergulhar na questão com mais detalhes, recomendo explorar os princípios gerais de como esses processos funcionam, por exemplo, Scratchapixel tem uma análise muito boa do assunto .
Os chamados "escopos" usados para consultar a visibilidade do jogo também são descartados por este sistema. Como a rasterização de software para threads computacionais é um processo longo, a ocupação é muito provavelmente baixa e, portanto, adicionar alguns quadros adicionais quase não tem efeito no desempenho. Com isso em mente, é provável que a luz seja projetada de forma assíncrona e, portanto, o impacto líquido no desempenho é mínimo.
Bloqueando a luz ambiente no espaço da tela
A oclusão de ambiente é calculada em meia resolução de uma forma bastante padrão: primeiro, 16 raios aleatórios emanam da posição de cada pixel no hemisfério e, em seguida, os raios que cruzam com a geometria são determinados usando o buffer de profundidade. Quanto mais raios cruzarem a geometria, maior será a obstrução. Esta técnica é chamada de Screen Space Directional Occlusion, ou SSDO, e uma descrição detalhada de Yuriy O'Donnell pode ser encontrada aqui . Em vez do armazenamento tradicional de valores de oclusão em uma textura de canal único, a oclusão direcional é armazenada em uma textura de três componentes e a oclusão resultante é definida por meio do produto escalar sobre o pixel normal.
Como o cálculo é feito na metade da resolução, o resultado é muito barulhento. Para melhorar a qualidade com um buffer de profundidade, o desfoque dos dois lados é aplicado. O bloqueio da luz ambiente geralmente ocorre em baixas frequências, portanto, o desfoque geralmente não é perceptível.

Passagem reta opaca
Nesta passagem, muitos dos elementos finalmente se encaixam. Ao contrário de Doom 2016, tudo aqui é renderizado diretamente por meio de vários mega-shaders enormes. Existem supostamente cerca de 500 estados de processador e uma dúzia de layouts de descritores ao longo do jogo. As armas do jogador são renderizadas primeiro, depois os objetos dinâmicos e depois os objetos estáticos. Observe que a ordem não é particularmente importante, porque graças ao pré-passo de profundidade já recebemos um buffer de profundidade, e ele pode excluir pixels que não correspondem à profundidade de antemão.

Armas do jogador

Objetos dinâmicos

Primeiro conjunto de objetos estáticos

Segundo conjunto de objetos estáticos
Para a maioria dos motores de jogos AAA, os gráficos de sombreador e os recursos de sombreador estático permitem que os desenvolvedores sejam criativos com todos os tipos de materiais e superfícies, e cada material, cada superfície, leva ao seu próprio sombreador exclusivo. Como resultado, nos deparamos com uma incrível variedade de permutações de shaders para todas as combinações possíveis de recursos do motor. No entanto, id Tech é muito diferente de outros projetos AAA: ele combina quase todos os materiais e recursos em apenas alguns mega-shaders massivos. Essa abordagem permite que as GPUs combinem a geometria com mais precisão, o que, por sua vez, tem um efeito positivo no desempenho. Discutiremos isso mais tarde.
Recursos ilimitados
É importante notar que todo o processo de formação de gráficos contém a ideia de "recursos não relacionados". Isso significa que em vez de vincular desfoque, reflexos, rugosidade da textura antes de cada chamada de desenho, toda a lista de texturas na cena é vinculada de uma vez. As texturas da lista são acessadas dinamicamente no shader por meio dos índices passados para o shader por constantes. Assim, através de qualquer chamada para desenhar, você pode obter qualquer textura, o que abre caminho para muitas otimizações, uma das quais falaremos agora.

Mesclando chamadas de desenho dinamicamente
Além de uma arquitetura de recursos completamente desacoplada, todos os dados de geometria são alocados em um grande buffer . Este buffer simplesmente armazena o deslocamento de toda a geometria.
É aqui que a tecnologia mais interessante da idTech 7 entra em jogo: fusão dinâmica de chamadas de draw.... Ele se baseia em uma arquitetura de recursos desacoplada e memória de vértice generalizada e, em última análise, reduz significativamente o número de chamadas de desenho e o tempo do processador. Antes de qualquer renderização começar, o sombreador de computação cria dinamicamente um buffer de índice "indireto" para mesclar geometrias de malhas não relacionadas em uma única chamada indireta de desenho. A fusão de chamadas não funcionaria sem recursos não relacionados, porque funciona com geometrias com propriedades de material incompatíveis. No futuro, será possível usar o buffer de índice dinâmico novamente, tanto para o pré-passe de profundidade quanto para o pré-passe de iluminação.
Reflexões
O sombreador computacional mais comum usa o algoritmo de raymarching para criar reflexos no espaço da tela. O algoritmo emite um raio do pixel para o espaço do mundo em direção à reflexão, que depende da aspereza da superfície refletora. O mesmo foi o caso em Doom 2016, onde um pequeno G-buffer foi registrado como parte do passe para frente. No entanto, em Doom Eternal não há mais nenhum G-buffer, e mesmo as reflexões do espaço da tela são calculadas não no shader computacional separadamente, mas imediatamente no shader direto . É interessante saber como tal desvio no pixel shader afeta o desempenho, uma vez que parece que às custas do aumento da carga no registro, os desenvolvedores estavam tentando reduzir o número de alvos de renderização e, como resultado, reduzir a carga na largura de banda da memória.
Freqüentemente, quando a textura do espaço da tela não contém as informações necessárias, os artefatos de renderização aparecem nos efeitos correspondentes. Isso é mais frequentemente visto em reflexos do espaço da tela em casos onde objetos reflexivos invisíveis não podem ser refletidos. O problema geralmente é resolvido com a abordagem tradicional, usando mapas de cubo de reflexão estática como backup.

Mas como as megatexturas não são mais usadas em Doom Eternal, também não há necessidade de texturas de fallback.
Partículas
Simulação
Em Doom Eternal, parte da simulação do processador de partículas recai sobre os ombros de sombreadores computacionais, uma vez que alguns sistemas de partículas dependem das informações do espaço da tela, como um buffer de profundidade para simular colisões. Enquanto outros sistemas de partículas podem ser executados no quadro de uma vez e calculados de forma assíncrona, tais simulações requerem dados preliminares de profundidade. O que é característico, ao contrário da simulação tradicional de shader de partículas, aqui a simulação é realizada através da execução de uma sequência de “comandos” do buffer armazenado no shader computacional. Cada thread de sombreador executa todos os comandos, entre os quais pode haver várias modificações de parâmetro kill, emit ou partícula. Tudo isso parece uma máquina virtual escrita em um shader. Não entendo muito sobre os meandros dessa simulação, mas a abordagem é baseadana apresentação de Brandon Whitney "The Destiny Particle Architecture" na Siggraph 2017 . O método na apresentação é muito semelhante ao que descrevi acima e é usado em muitos outros jogos. Por exemplo, tenho quase certeza de que o sistema de simulação de partículas do Niágara funciona de maneira semelhante no Unreal Engine 4.
Iluminação
Semelhante ao Doom 2016 e ao método descrito no Siggraph 2016, a resolução das partículas de iluminação é desacoplada da resolução real da tela , dando aos desenvolvedores controle sobre a resolução de cada sistema de partículas com base na qualidade, tamanho da tela e controle direto. Para efeitos de baixa frequência, a iluminação pode ser fornecida em uma resolução muito mais baixa com quase nenhuma perda de qualidade em comparação com, por exemplo, faíscas que requerem alta resolução. A iluminação e a direção dominante da luz são armazenadas em dois atlas de 2048 por 2048 pixels, ambos disponíveis para cada passagem por recursos não acoplados, como qualquer outra textura. Além disso, para renderizar partículas, geometria simples é desenhada por meio de amostragem desses atlas.

Um fragmento ampliado de um atlas de iluminação.
Céu e dispersão
Agora vamos falar sobre iluminação volumétrica . Sua geração consiste em quatro passagens e começa criando uma textura 3D LUT para a atmosfera do céu por meio de raymarching através do próprio céu em direção à fonte de luz.

Da primeira vez, você pode não entender exatamente o que a textura exibe na imagem, mas se girarmos 90 graus e esticarmos horizontalmente, tudo fica claro: temos uma dispersão da atmosfera. Como é mais variável verticalmente do que horizontalmente, a resolução vertical é maior. A atmosfera é representada por uma esfera, então a rotação horizontal é geralmente chamada de longitude e a rotação vertical é geralmente chamada de latitude. A dispersão atmosférica é calculada pelo hemisfério e cobre 360 graus de longitude e 180 graus de latitude para o topo da esfera. Para cobrir distâncias diferentes para o observador, a textura LUT contém 32 segmentos de profundidade e, em vez de recalcular os dados do céu em cada quadro, o processo é espalhado por 32 quadros.

Graças à textura LUT, a próxima passagem calcula a dispersão de luz pelo "froxel" observado por analogia com uma obstrução de aglomerado de luz em uma escala menor. Você pode observar vários segmentos, de perto a longe, abaixo.

Na terceira passagem, os dados de espalhamento para cada célula são multiplicados em cada célula subsequente em direção à visualização e gravados em uma nova textura 3D.
Como resultado, a iluminação volumétrica é colocada no topo da imagem renderizada por meio de amostragem da textura 3D recém-gerada com base na profundidade do pixel.

Antes

Depois
O céu "visível" final é renderizado em um hemisfério se estiver na visualização. Nesta cena, o céu não foi incluído na revisão, mas abaixo você pode dar uma olhada em um exemplo de renderização do céu em uma cena externa.

Transparência
Semelhante ao Doom 2016, a transparência é renderizada por uma passagem para frente após a geometria opaca quando há dados de dispersão de luz. A textura da cena, neste caso, perde resolução (downsamples) e, para "simular" a transparência com base na suavidade da superfície, um nível mip adequado é selecionado. Os dados de dispersão de luz ajudam a criar uma boa dispersão visualmente do interior da superfície.
Abaixo, você pode ver um exemplo de uma cadeia de mip de textura da cena, onde superfícies mais transparentes caem na janela de exibição.

Para transparência, apenas os pixels relacionados a ela são perdidos na resolução.
Interface de usuário
Normalmente, a última passagem em um quadro é a interface do usuário. Como de costume, a interface é renderizada em um alvo de renderização LDR (oito bits) de resolução completa secundária e a cor é pré-multiplicada pelo canal alfa. Durante o mapeamento de tons, a interface é sobreposta na textura HDR. Fazer a interface funcionar com o resto do conteúdo HDR no quadro geralmente é complicado, mas em Doom Eternal, o mapeamento de tons escala magicamente a interface e parece natural em comparação com outro conteúdo 3D.

Pós-processamento
A primeira coisa no pós-processamento é o desfoque : esse efeito de duas passagens lê os dados da textura de cor e um buffer de velocidade personalizado. A primeira passagem coleta quatro amostras no eixo vertical, a segunda - quatro ao longo da horizontal. Em seguida, as amostras de cores são combinadas de acordo com o movimento do pixel. Para evitar o desfoque, o buffer de velocidade personalizado deve garantir que não haja fantasmas e que a arma do jogador seja excluída do processo.
Em seguida, vem o impacto desejado: Esta textura RG (bicolor) 1 por 1 contém a iluminação média de toda a cena e é calculada diminuindo sucessivamente a resolução da textura da cor e obtendo a iluminação média de um grupo de pixels. Na maioria das vezes, essa técnica é usada para simular a habituação do olho humano a uma mudança brusca no brilho do ambiente. Além disso, a iluminação média é usada ao calcular o impacto durante o mapeamento de tons.

Depois de tudo isso, Bloom é calculado . Este efeito não é suficiente em nosso exemplo e não será possível renderizá-lo amplamente, mas basta saber que o cálculo se realiza obtendo dados de cor acima de um determinado limite e diminuindo sucessivamente a resolução da textura para desfocá-la.
Então mapeamento de tomcombina todos os efeitos. Um único sombreador de computação faz o seguinte:
- Aplica distorção
- Renderiza sobre a textura Bloom
- Calcula vinhetas, sujeira na câmera, aberração cromática, reflexo de lente e muitos outros efeitos
- Obtém o valor da exposição com base na iluminação média
- Permite o mapeamento de tons para distribuir cores HDR nas faixas corretas para LDR e HDR por meio de um operador de mapeamento de tons personalizado.
Finalmente, a interface é sobreposta na parte superior.
A textura de distorção é renderizada antes mesmo da passagem de pós-processamento: a geometria como uma névoa de fogo de efeitos de partículas é renderizada em um novo alvo de renderização em um formato com um quarto da resolução original. Nesta renderização, os dados de distorção são armazenados nos canais vermelho e verde, e a oclusão no azul. Os dados obtidos são aplicados quando a imagem é distorcida na etapa de mapeamento de tons.

Conclusão
Nossa análise rápida de uma cena de Doom Eternal chegou ao fim, embora eu tenha certeza de não ter tocado em algumas coisas que afetam a aparência do jogo. Na minha opinião, Doom Eternal é um sucesso técnico incrível, e a id Software será capaz de elevar a barra ainda mais no futuro. A equipe de desenvolvimento demonstrou com sucesso como o pensamento inteligente e o planejamento eficaz ajudaram a criar um jogo de alta qualidade, e acredito que este é um excelente modelo, além de material educacional. Estou ansioso para futuros desenvolvimentos da id Software.
Rasgue e rasgue, até que esteja feito.