Nesta segunda parte, onde daremos uma olhada mais aprofundada na criação de jogos 3D, vamos nos concentrar no que acontece com o mundo 3D depois que todo o processo de canto é concluído. Teremos de tirar o pó de nossos livros de matemática novamente, lidar com a geometria da frustração e pensar no quebra-cabeça da perspectiva. Também faremos um rápido mergulho no rastreamento de raios, iluminação e física dos materiais - perfeito!

O tópico principal deste artigo é um estágio importante na renderização, onde o mundo tridimensional de pontos, linhas e triângulos se torna uma grade bidimensional de blocos coloridos. Isso é algo que apenas 'acontece' porque os processos de mudança 3D-2D são invisíveis, nosso artigo anterior aqui pudemos ver imediatamente os efeitos dos sombreamentos e mosaicos de canto. Se você não estiver pronto para tudo isso, não se preocupe - você pode começar. Renderização de jogos 3D 101. No entanto, continue lendo para nossa próxima visão do mundo dos gráficos 3D, uma vez que esteja definido.

Preparando para 2 dimensões

A maioria de vocês verá este site em um monitor totalmente plano ou tela de smartphone; Mesmo que você seja legal e calmo com as crianças e tenha um monitor curvo sofisticado, as imagens que ele exibe são compostas por uma grade plana de pixels coloridos. Ainda assim, as imagens parecem ser 3D ao jogar Call of Mario: Deathduty Battleyard. Os objetos entram e saem do ambiente à medida que entram e saem da câmera.

Usando Bethesda Fallout 4 Como um exemplo de 2014, podemos ver facilmente como os cantos são tratados para criar uma sensação de profundidade e distância, especialmente se você estiver executando no modo wireframe (acima).




Se você escolher qualquer jogo 3D de hoje ou dos últimos vinte anos, quase todos eles realizarão a mesma sequência de eventos para transformar o mundo 3D de vértices em uma matriz de pixels 2D. O nome do processo que fez a mudança geralmente é chamado pixelização mas esta é apenas uma das muitas etapas em todo o processo.




Precisaremos quebrar alguns dos vários estágios e estudar as técnicas e matemática usadas e usaremos a sequência usada pelo Direct3D para investigar o que está acontecendo para referência. A imagem abaixo mostra o que foi feito em cada pico do mundo:







O que foi feito no cenário espacial mundial? Artigo da Parte 1: Aqui os vértices são transformados e coloridos usando cálculos de matrizes múltiplas. Pularemos a próxima seção porque a única coisa para a área da câmera é que os cantos convertidos são ajustados após o movimento para fazer o ponto de referência da câmera.

As próximas etapas são cruciais para pular porque são absolutamente essenciais para a transição de 3D para 2D - feito da maneira certa, e nosso cérebro olhará para uma tela plana, mas 'verá' uma cena com profundidade e escala - feito de forma errada e as coisas parecerão muito estranhas!




É tudo uma questão de perspectiva

A primeira etapa nesta sequência envolve a definição do campo de visão visto pela câmera. Isso é feito primeiro ajustando os ângulos para o campo de visão horizontal e vertical - o primeiro pode frequentemente ser alterado em jogos porque as pessoas têm melhor visão periférica lateral do que para cima e para baixo.

Podemos entender isso a partir desta imagem que mostra o campo da visão humana:




Dois ângulos de visão (fov para breve), tronco - uma pirâmide quadrada 3D saindo da câmera. Primeiro ângulo vertical fov, o segundo horizontal 1; vamos usar símbolos α ve β para mostrar a eles. Agora não vemos o mundo exatamente assim, mas é muito mais fácil trabalhar com um tronco do que tentar criar um volume de imagem realista.

Duas outras configurações também precisam ser definidas - posição próxima (ou frontal) e distante (traseira) planos de recorte. O primeiro corta o topo da pirâmide, mas principalmente determina o quão perto a câmera está da posição onde qualquer coisa foi desenhada; o segundo faz o mesmo, mas define o quão longe os primitivos serão removidos da câmera.

O tamanho e a posição do plano de recorte próximo são importantes porque isso é Visão,. Isso é realmente o que você vê no monitor, ou seja, quadro renderizado e na maioria das APIs de gráficos, a visualização é 'desenhada' no canto superior esquerdo. Na imagem abaixo, o ponto (a1, b2) será a fonte do plano e a largura e altura do plano são medidas a partir daqui.

proporção da tela Assim como a perspectiva é muito importante para a aparência do mundo criado, ela também deve corresponder à proporção do monitor. Por muitos anos, é sempre 4: 3 (ou 1,3333 ... em decimal). Hoje, a maioria de nós tem jogos widescreen e ultra wide screen como 16: 9 ou 21: 9.

As coordenadas de cada vértice na área da câmera precisam ser transformadas para que todos caibam no plano de recorte próximo, conforme mostrado abaixo:

A transformação é feita usando outra matriz - para esta em particular matriz de projeção em perspectiva. Em nosso exemplo abaixo, usamos a área de corte e as posições dos planos de corte para transformar; podemos usar as dimensões da janela de visualização.

O vetor de posição do vértice é multiplicado por esta matriz e fornece um novo conjunto transformado de coordenadas.

Et voila! Agora escrevemos todos os nossos cantos para que a Terra original agora apareça como uma perspectiva 3D forçada, de forma que os primitivos próximos ao plano de pré-recorte pareçam maiores do que aqueles próximos ao plano distante.

Embora o tamanho da vista e os ângulos do campo de visão sejam interdependentes, eles podem ser processados ​​individualmente - em outras palavras, você pode ter o tronco para dar um plano de recorte diferente de acordo com o tamanho e a proporção da vista. Para que isso aconteça, é necessária uma etapa adicional na cadeia, na qual os cantos no plano de corte próximo devem ser reciclados para compensar a diferença.

No entanto, isso pode causar distorção na perspectiva exibida. usar Skyrim do jogo da Bethesda de 2011, podemos ver como o ângulo de visão horizontal é ajustado βTem um impacto significativo na cena, mantendo a mesma proporção da janela de visualização:

Nesta primeira imagem, β = 75 ° e a cena parece perfeitamente normal. Vamos tentar agora β = 120°:

As duas diferenças são imediatamente óbvias - primeiro de tudo, podemos ver muito mais para os lados de nossa 'visão' agora e, segundo, objetos agora aparecem muito mais distantes (especialmente árvores). No entanto, o impacto visual da superfície da água atualmente não é visível e isso ocorre porque o processo não foi projetado para este campo de visão.

Agora, suponha que nosso personagem tenha olhos estranhos e semelhantes a olhos. β = 180°!

Este campo de visão nos dá uma visão quase panorâmica, mas à custa de sérias distorções nos objetos criados nas bordas da visão. Novamente, isso ocorre porque os designers do jogo não planejaram e criaram os ativos e efeitos visuais do jogo para este ponto de vista (o valor padrão é em torno de 70 °).

A câmera pode parecer ter se movido nas imagens acima, mas isso não aconteceu - tudo o que aconteceu é que a forma do meu tronco foi alterada, o que remodelou as dimensões do plano de recorte próximo. Em cada imagem, a proporção da janela de visualização permaneceu a mesma, então uma matriz de dimensionamento foi aplicada aos cantos para reajustar tudo.

Então, você está dentro ou fora?

Depois que tudo for transformado corretamente no estágio de projeção, passamos para o que é chamado área do clipe. Embora isso seja feito Então projeção é mais fácil de visualizar o que está acontecendo se fizermos isso antes:

Em nosso diagrama acima, podemos ver que o pato de borracha, um dos morcegos e algumas árvores são triângulos em frustum; No entanto, o outro morcego, a árvore mais distante, e o panda estão fora do tronco. Embora os cantos que constituem esses objetos já tenham sido usinados, eles não aparecem na janela de exibição. Isso significa encurtado.

In colheita de frustumTodos os princípios, exceto frustum, são completamente removidos e os primitivos encontrados em qualquer uma das fronteiras são remodelados para novos primitivos. Corte, até este ponto, todos os cantos invisíveis, sombreadores de canto etc. Não é realmente um aumento de desempenho, uma vez que é executado via. A própria fase de recorte também pode ser ignorada se necessário, mas isso não é suportado por todas as APIs (por exemplo, o OpenGL padrão não permite que você ignore isso, mas é possível fazer isso usando uma extensão de API).

Deve-se notar que a localização do plano de recorte remoto não é necessariamente a mesma. distância de desenho Nos jogos, o último é controlado pelo próprio motor de jogo. Qualquer outra coisa que o motor fará Frustum Cull - aqui o código é executado para determinar se um objeto estará em frustum e / ou para afetar qualquer coisa que seja visível; Se a resposta for noEste objeto não é enviado para criação. Isso não é o mesmo que corte de decepção, porque embora os itens primitivos da frustração tenham caído, eles passam pelo estágio de pico de processamento. Com a subtração, eles não são processados, economizando bastante desempenho.

Agora que fizemos toda a nossa transformação e corte, os cantos finalmente parecem prontos para o próximo estágio em toda a sequência de renderização. Eles não estão fora disso. Isso ocorre porque toda a matemática realizada na manipulação de vértices e operações espaciais de mundo para clipe deve ser feita com um sistema de coordenadas homogêneo (ou seja, cada vértice tem 4 componentes em vez de 3). No entanto, a visualização é completamente 2D, então as informações do vértice API são apenas x, y (valor de profundidade z é preservado embora).

Para se livrar do 4º componente, seção de perspectiva cada componente w valor. Esta configuração bloqueia o intervalo de valores x ve y [-1,1] pode levar e z Intervalo [0,1] - são chamados coordenadas normalizadas do dispositivo (NDCs para abreviar).

Se você quiser saber mais sobre o que acabamos de cobrir e ficar feliz em mergulhar em muito mais matemática, Song Ho Ahn's excelente tutorial Sobre o tema. Vamos converter esses cantos em pixels!

Mestre raster

Assim como acontece com as transformações, veremos como o Direct3D define as regras e ações para transformar a janela de visualização em uma grade de pixels. Esta grade é como uma planilha com linhas e colunas em que cada célula contém vários valores de dados (cor, valores de profundidade, coordenadas de textura, etc.). Normalmente, esta grade raster e o processo de produção pixelização. Nosso Renderização 3D 101 artigos, temos uma visão muito simplificada do procedimento:

A imagem acima dá a impressão de que os primitivos foram cortados apenas em pequenos blocos, mas há muito mais do que isso. O primeiro passo é entender se um primitivo está realmente olhando para a câmera - em uma imagem anterior deste artigo, os primitivos que compunham as costas do coelho cinza, mostrando decepção, por exemplo, são visíveis. Portanto, não há necessidade de criá-los, embora estejam localizados no campo de visão.

Com o diagrama abaixo, podemos entender aproximadamente como isso se parece. O cubo passou por várias transformações para colocar o modelo 3D no espaço de exibição 2D e, na visão da câmera, algumas das faces do cubo não são visíveis. Assumindo que nenhuma das superfícies seja transparente, algumas dessas primitivas podem ser ignoradas.

Direct3D'de bu, sisteme status de processamento será e esta instrução dirá a sua remoção (também conhecida como descartar) para cada lado primitivo voltado para a frente ou para trás (ou não ser cego - por exemplo, wireframe modo). Então, como ele sabe o que é a frente ou o verso? Quando olhamos matemática na usinagem de cantoVimos que triângulos (ou têm mais vértices) têm vetores normais que informam ao sistema para que direção ele está voltado. Com essas informações, uma verificação simples pode ser feita e se a verificação primitiva falhar, ela será removida da cadeia de geração.

Então é hora de começar a implementar a grade de pixels. Novamente, isso é surpreendentemente complexo porque se um pixel se encaixa completamente em um primitivo - completamente, parcialmente ou de todo - o sistema deve funcionar. Para fazer isso, teste de escopo feito. A imagem abaixo mostra como os triângulos são rasterizados no Direct3D 11:

A regra é bastante simples: se o centro do pixel exceder o que a Microsoft o chama, o pixel é considerado um triângulo. regra 'superior esquerdo'. A parte 'superior' é um controle de linha horizontal; centro do pixel on está linha. A parte 'esquerda' é para linhas não horizontais e o centro do pixel deve ficar à esquerda de tal linha. Existem regras adicionais para não primitivos, ou seja, linhas e pontos simples, e se as regras ganham condições extras multisampling'i estão empregados.

Se olharmos atentamente a imagem na documentação da Microsoft, podemos ver que as formas criadas pelos pixels não são muito semelhantes às primitivas originais. Isso ocorre porque os pixels são muito grandes para formar um triângulo realista - o raster contém dados insuficientes sobre os objetos originais e sobreposição.

Vamos usar 3DMark03 da UL Benchmark Para ver o alias em processamento:

Na primeira imagem, o tamanho da digitalização é definido para um valor muito baixo de 720 x 480 pixels. A sobreposição é claramente visível no corrimão e a sombra arremessa a arma empunhada pelo soldado superior. Compare isso com o que você obtém com uma digitalização com 24 vezes mais pixels:

Aqui podemos ver que o apelido na grade e na sombra sumiu completamente. Pode parecer um caminho de varredura maior a cada vez, mas as dimensões da grade devem ser suportadas pelo monitor no qual o quadro será exibido e esses pixels devem ser processados ​​após a rasterização. sendo uma penalidade de desempenho óbvia.

É aqui que a multiamostragem pode ajudar, e funciona no Direct3D assim:

Em vez de verificar se um centro de pixel atende às regras de rasterização, vários locais (amostras de sub-pixel ou subamostras) são testados em cada pixel e, se algum deles for apropriado, esse pixel faz parte da forma. Isso pode não ajudar e até piorar o alias, mas quando a multiamostragem é usada, quais subamostras são cobertas pela primitiva e os resultados do processamento do pixel são armazenados em um buffer na memória.

Esse buffer é então usado para misturar os dados de subamostra e pixel para que as arestas primitivas sejam menos bloqueadas. Veremos toda a situação paralisada novamente em um artigo posterior, mas por enquanto, isso é o que a multiamostragem pode fazer quando usada em uma varredura de pixels muito baixos:

Podemos ver que a quantidade de anti-aliasing nas bordas das várias formas é bastante reduzida. Um raster maior é definitivamente melhor, mas o impacto no desempenho pode suportar o uso de multiamostragem.

Qualquer outra coisa que possa ser feita no processo de rasterização teste de oclusão. Isso deve ser feito porque o campo de visão estará cheio de primitivas que se sobreporão (bloqueado) - por exemplo, na imagem acima, os triângulos da frente que formam os solideri em primeiro plano se sobrepõem aos mesmos triângulos do outro soldado. Além de verificar se um primitivo cobre um pixel, as profundidades relativas também podem ser comparadas e ignoradas do resto do processo de renderização se uma estiver atrás da outra.

No entanto, se o quase primitivo for transparente, o outro ainda estará visível, embora falhe na verificação de oclusão. É por isso que quase todos os motores 3D fazem verificações de oclusão antes de Enviando algo para a GPU e em vez disso Tampão Z como parte do processo de criação. É aqui que o quadro é normalmente renderizado, mas a GPU armazena apenas os valores de profundidade, em vez de armazenar as cores finais dos pixels na memória. Isso pode ser usado em sombreadores para controlar a visibilidade com maior controle e precisão sobre os aspectos que envolvem a sobreposição de objetos.

Na imagem acima, quanto mais escura a cor do pixel, mais próximo o objeto está da câmera. Para fazer o buffer z, o quadro é criado uma vez e depois reconstruído, mas desta vez, quando os pixels são processados, um sombreador é executado para verificá-los em relação aos valores no buffer z. Se não estiver visível, esta cor de pixel não é colocada no buffer de quadro final.

Por agora, o último passo real interpolação de atributo de vértice - em nosso primeiro diagrama simplificado, o primitivo era um triângulo completo, mas lembre-se de que a visualização é preenchida com vértices das formas, não a própria forma. Portanto, o sistema precisa descobrir como a cor, a profundidade e a textura do primitivo estão entre os cantos, e é assim que se chama. interpolação. Como você pode imaginar, este não é um cálculo simples, mas outro cálculo.

Embora a tela rasterizada seja 2D, as estruturas internas representam uma perspectiva 3D forçada. Se as linhas fossem realmente bidimensionais, um simples linear várias cores e assim por diante, conforme você vai de um pico a outro. Mas por causa do aspecto 3D da cena, a interpolação precisa levar a perspectiva em consideração - Simon Yeung'un muhteşem blogu para obter mais informações sobre o processo.

Aqui vamos nós - o mundo 3D dos cantos se torna uma grade 2D de blocos coloridos. Ainda assim, não fizemos muito.

Tudo da frente para trás (exceto quando não estiver lá)

Antes de terminarmos nossa análise da rasterização, precisamos dizer algo sobre a ordem de renderização. Por exemplo, não estamos falando sobre de onde veio a tesselação; em vez disso, estamos falando sobre a ordem dos primitivos. Os objetos são freqüentemente processados ​​na ordem em que aparecem no buffer de diretório (o bloco de memória que informa ao sistema como os vértices são agrupados) e isso pode ter um impacto significativo em como os objetos transparentes e os efeitos são tratados.

Isso se deve ao fato de os primitivos serem tratados um por um e, se você fizer os frontais primeiro, ninguém atrás deles ficará visível (é aqui que a classificação de oclusão realmente entra em jogo). e pode ser retirado de ação (ajuda no desempenho) - isso geralmente é 'de frente para trás requer que a criação e o buffer de diretório sejam ordenados desta forma.

No entanto, se alguns desses primitivos bem na frente da câmera forem transparentes, a renderização de frente para trás resultará em objetos perdidos atrás do transparente. Uma solução é fazer tudo da frente para trás, com primitivos transparentes e efeitos sendo feitos por último.

Então, todos os jogos modernos são renderizados consecutivamente, certo? Se não for útil - tenha em mente que cada renderização primitiva terá um custo de desempenho muito maior do que pode ser visto. Existem outras maneiras de lidar com objetos transparentes, mas, de modo geral, não existe uma solução única para todos e cada situação precisa ser tratada de uma maneira única.

Isso basicamente resume os prós e contras da rasterização - em hardware moderno, é muito rápido e eficaz, mas ainda é uma aproximação do que estamos vendo. No mundo real, cada objeto absorve, reflete e talvez refrata a luz, e tudo isso tem um efeito na cena que está sendo vista. Obtemos um resultado rápido, mas aproximado, dividindo o mundo em primitivos e criando apenas alguns deles.

Se ao menos houvesse outra maneira ...

is Outra forma: traçado de raio

Cerca de duas décadas atrás, um cientista da computação chamado Arthur Appel desenvolveu um sistema para criar imagens em um computador de forma que um único feixe de luz direto fosse lançado da câmera até atingir um objeto. A partir daí, as propriedades do material (cor, refletividade, etc.) mudam a intensidade do feixe de luz. Cada pixel na imagem renderizada teria uma projeção de raio e um algoritmo seria executado para decodificar a cor do pixel, passando por uma sequência matemática. Processo de Appel Fundição de trilhos.

Cerca de 10 anos depois, outro cientista John Whitted Ele desenvolveu um algoritmo matemático que era o mesmo da abordagem de Appel, mas quando o feixe atingisse um objeto, ele geraria feixes adicionais que seriam disparados em várias direções, dependendo do material do objeto. Como esse sistema geraria novos raios para cada interação de objeto, o algoritmo era recursivo e, portanto, muito mais difícil computacionalmente; no entanto, ele tinha uma vantagem significativa sobre o método de Appel, pois poderia explicar adequadamente a reflexão, refração e sombreamento. O nome deste procedimento é: Rastreamento de raio (para ser honesto, para trás rastreamento de raio, como seguimos o raio da câmera, não o objeto) e o Santo Graal para computação gráfica e filmes desde aquele tempo.

O nome desse procedimento era traçado de raio (traçado de raio reverso, estritamente falando, porque rastreamos os raios da câmera ao invés de objetos) e tem sido o Santo Graal para computação gráfica e filmes desde então.

Na imagem acima, podemos ter uma ideia do trabalho de Whitted no algoritmo. Um feixe é emitido da câmera para cada pixel do quadro e viaja até atingir uma superfície. Esta superfície em particular é translúcida, então a luz irá refletir e refratar através dela. Em ambos os casos, raios secundários são gerados e saem até interagirem com uma superfície. Há também um secundário adicional que leva em consideração a cor das fontes de luz e as sombras que elas fazem.

A parte recursiva do processo é que feixes secundários podem ser gerados cada vez que um novo feixe fundido cruza uma superfície. Isso pode facilmente sair do controle, portanto, o número de feixes secundários gerados é sempre limitado. Quando um caminho de feixe é concluído, sua cor em cada ponto terminal é calculada de acordo com as propriedades do material daquela superfície. Este valor então passa o feixe para o anterior, ajustando a cor desta superfície, e assim por diante, até atingir o ponto de origem efetivo (pixel no quadro) do feixe primário.

Isso pode ser extremamente complexo e até mesmo cenários simples podem criar um limite computacional para ultrapassar. Felizmente, algumas coisas podem ser feitas para ajudar - uma delas seria usar um hardware especialmente projetado para acelerar essas operações matemáticas específicas, assim como para fazer matemática de matrizes na usinagem de cantos (mais adiante)). Outra coisa crítica é acelerar o processo de trabalhar em qual objeto um raio atinge e exatamente onde ele está na superfície do objeto onde ele se cruza - o que pode ser surpreendente se o objeto for feito de um grande número de triângulos. difícil de fazer:

Em vez de testar cada triângulo, uma lista de volumes delimitadores (BV) é criada em cada objeto antes do traçado de raio - eles nada mais são do que cubóides circundando o objeto em questão, e estes são sucessivamente menores para as várias estruturas dentro dele. objeto.

Por exemplo, o primeiro BV seria para o coelho inteiro. O próximo par é a cabeça, pernas, tronco, cauda, ​​etc. cada uma dessas pequenas estruturas na cabeça, etc. Haverá outra coleção de volumes para cada um e o nível de volume final conterá um pequeno número de triângulos a serem testados. Todos esses volumes são então organizados em uma lista ordenada ( Hierarquia BV ou BVH para breve) para que o sistema controle um número relativamente pequeno de BV a cada vez:

Embora o uso de um BVH não acelere tecnicamente o traçado de raio real, a criação da hierarquia e do algoritmo de pesquisa subsequente é frequentemente muito mais rápido do que ter que verificar se um feixe cruza um dos milhões de triângulos. Em um mundo 3D.

Programas como o de hoje batedeira ve POV-Ray Use o rastreamento de raios com rastreamento adicional (como rastreamento de fótons e rádio) para criar imagens altamente realistas:

A pergunta óbvia a se fazer é se o rastreamento de raios é tão bom, por que não o usamos em todos os lugares? As respostas estão em duas áreas: em primeiro lugar, mesmo o traçado de raios simples produz milhões de raios que precisam ser calculados continuamente. O sistema começa com apenas um feixe por pixel da tela, portanto, com uma resolução de apenas 800 x 600, ele produz 480.000 feixes primários, cada um produzindo vários feixes secundários. Este é um negócio sério, mesmo para os computadores desktop de hoje. A segunda questão é que o traçado de raio básico não é realmente muito realista e várias equações extras e muito complexas devem ser incluídas para serem corretas.

Mesmo com hardware de PC moderno, a quantidade de trabalho necessária para fazer isso em tempo real para um jogo 3D atual está além do escopo. Nosso 3D render 101 Em seu artigo, vimos que demorou dezenas de segundos para produzir uma única imagem de baixa resolução em um benchmark de traçado de raio.

Então, como o Wolfenstein original estava fazendo a projeção de feixes em 3D, voltando em 1992 e por que gostou? Battlefield V ve Migração Metro, ambos lançados em 2019, oferecem recursos de rastreamento de raio? Eles são rasterizados ou traçados em raios? Resposta: um pouco de cada.

Uma abordagem híbrida para hoje e para o futuro

Em março de 2018, a Microsoft anunciou uma nova extensão de API para Direct3D 12 chamada DXR (DirectX Raytracing). Esta era uma nova linha de gráfico que complementava a rasterização padrão e os pipelines computacionais. Funcionalidades adicionais, shaders, estruturas de dados, etc. Ele foi fornecido na introdução, mas não exigia nenhum suporte especial de hardware além do que já é exigido para Direct3D 12.

Na mesma Game Developers Conference, Falou sobre Microsoft DXRElectronic Arts falou sobre eles Pica Pica Projesi - Experiência de motor 3D usando DXR. Eles mostraram que o traçado de raio pode ser usado, mas não para o quadro de renderização completo. Em vez disso, técnicas tradicionais de rasterização e sombreador computacional serão usadas para a maior parte do trabalho, DXR é usado para certas áreas - o que significa que o número de raios gerados é muito menor do que para toda a cena.

Esta abordagem híbrida foi usada no passado em menor extensão. Por exemplo, Wolfenstein 3D fundição de trilho usado para resolver a aparência do quadro renderizado, mas feito com um feixe por coluna de pixel, não por pixel. Isso ainda pode parecer muito impressionante até que eu percebi que o jogo estava rodando inicialmente com uma resolução de 640 x 480, então não mais do que 640 feixes estavam funcionando ao mesmo tempo.

A placa de vídeo do início de 2018 - como a Radeon RX 580 da AMD ou a GeForce 1080 Ti da Nvidia - certamente atendia aos requisitos de hardware para DXR, mas mesmo com recursos de computação, houve alguns equívocos de que seriam potentes o suficiente para usar DXR. significativamente.

Isso mudou um pouco em agosto de 2018, quando a Nvidia lançou sua mais nova arquitetura de GPU, codinome Turing. A característica crítica desse chip era algo chamado RT-Cores: unidades lógicas especiais para acelerar a interceptação do feixe com o triângulo e os cálculos cruzados da hierarquia de volume limite (BVH). Esses dois processos são rotinas demoradas para trabalhar onde uma luz interage com triângulos que compõem vários objetos em uma cena. Dado que os RT Cores são específicos para o processador de Turing, o acesso a eles só pode ser feito por meio da API proprietária da Nvidia.

O primeiro jogo a oferecer suporte a esse recurso é o Battlefield V da EA e Quando testamos o uso de DXR, ficamos impressionados com a melhoria nos reflexos de água, vidro e metal no jogo, mas menos impressionados com os sucessos de desempenho subsequentes:

Para ser justo, os patches posteriores melhoraram um pouco, mas houve (e ainda há) uma grande queda na velocidade com que os quadros são renderizados. Até 2019, surgiram alguns outros jogos que suportam essa API e executam o rastreamento de raios para certas partes em um quadro. Nós testamos Migração Metro ve Tomb Raider Shadowe descobri uma história semelhante - DXR afetaria particularmente a taxa de quadros quando usado extensivamente.

Quase ao mesmo tempo, Benchmarks UL ele explicou Um teste de recurso DXR para 3DMark:

No entanto, nossa análise de jogos habilitados para DXR e o teste de recurso 3DMark provaram que uma coisa é certa sobre o traçado de raio: em 2019, ainda é um trabalho sério até mesmo para os modelos de mais de $ 1000 para o processador gráfico. Isso significa que não temos uma alternativa real para a rasterização?

Os recursos mais recentes em tecnologia de gráficos 3D para consumidores costumam ser muito caros, e o suporte inicial de novos recursos de API pode ser bastante irregular ou lento (como descobrimos) Quando testamos Max Payne 3 Em uma série de lançamentos do Direct3D por volta de 2012) - o último é geralmente devido aos desenvolvedores de jogos que tentam incluir tantos recursos avançados quanto possível, às vezes com experiência limitada.

No entanto, quando sombreadores de vértice e pixel, tesselação, renderização HDR e oclusão de ambiente de espaço de tela já eram bastante exigentes, adequados apenas para GPUs de ponta, seu uso agora é comum em jogos e suportado por uma ampla variedade de placas gráficas. O mesmo será verdadeiro para o traçado de raio e, com o tempo, ele se tornará apenas outra configuração de detalhe habilitada por padrão para a maioria dos usuários.

Alguns pensamentos finais

E assim chegamos ao final de nosso segundo mergulho profundo, onde olhamos mais de perto o mundo dos gráficos 3D. Vimos como os cantos dos modelos e mundos mudam do 3D e se transformam em uma imagem 2D plana. Vimos como as configurações do campo de visão devem ser consideradas e que efeito elas produzem. O processo de pixelar esses cantos foi explorado e terminamos com uma breve olhada em um processo alternativo para rasterização.

Como antes, não poderíamos cobrir tudo e não poderíamos dar uma olhada em alguns detalhes aqui e ali - não é um livro didático, afinal! No entanto, esperamos que você tenha aprendido um pouco mais ao longo do caminho e um novo fascínio para programadores e engenheiros que realmente dominam a matemática e as ciências necessárias para realizar tudo isso em seus títulos 3D favoritos.

Teremos prazer em responder suas perguntas, então fique à vontade para postar nosso caminho na seção de comentários. Até a próxima.

Crédito de manchete: Resumo de raster de impressão monocromática por Aleksei Deep