Shaders transversais, o que são e quais aplicativos têm na GPU

Transversal Shaders

Desde o surgimento do DirectX 8, o número de novos tipos de shader vem aumentando ao longo do tempo, os próximos a serem incluídos na lista são chamados de Traversal Shaders, que têm a ver com os avanços para a adoção com pausa, mas sem freio de traçado de raio em jogos. Vamos ver em que consiste e quais melhorias trará para os jogos em termos de desempenho.

Shaders transversais são uma das duas filosofias a fim de apresentar o problema do caminho da estrutura de dados espaciais em Ray Tracing, que consiste no uso de programas de shader para percorrer a estrutura de dados espaciais que representa a cena, em vez de usar programas especializados ou dedicados hardware.

Em primeiro lugar, vamos lembrar o que é um Shader

Exemplo de funcionamento do shader

Em software, conhecemos coloquialmente como um shader um programa que roda nos núcleos do GPU, que têm nomes diferentes dependendo do fabricante. Então AMD chama essas peças de unidades de computador de hardware em seu Radeon, NVIDIA os chama de Stream Multiprocessors ou SM em sua GeForce e Intel dá-lhes em seus nomes ARC essas unidades Xe Core.

Portanto, o próprio shader é o software que roda em uma dessas unidades, que funcionam de forma muito próxima a um CPU, a diferença é que um sombreador é um programa executado em uma primitiva gráfica nos diferentes estágios do pipeline de renderização: vértices, primitivas, triângulos, fragmentos ou pixels. Embora essas categorias nada mais sejam do que abstrações que fazemos, para a unidade de sombreador tudo são dados e isso significa que eles podem executar todos os tipos de programas.

Então, por que não usar uma CPU? Pois bem, pelo facto de existirem problemas que as GPUs, por serem concebidas para funcionar em paralelo, funcionam muito melhor na resolução de determinados contextos do que uma CPU, e da mesma forma que acontece no caso das GPUs.

Microsoft, DirectX Ray Tracing e seus shaders

Rastreamento de raio Microsoft DirectX 12

Quando Redmond falou pela primeira vez sobre a implementação de rastreamento de raio na Games Developer Conference em 2018, faltavam alguns meses para o lançamento do NVIDIA RTX 20 e naquela época era completamente desconhecido, pelo menos publicamente, do Existem unidades para acelerar Ray Tracing, como os núcleos RT da NVIDIA e as unidades de aceleração Ray da AMD.

Qual foi MicrosoftA proposta de expandir sua API multimídia? Bem, adicione uma série de estágios adicionais, que são definidos no diagrama a seguir:

Etapas DXR

Compreender o diagrama é fácil:

  • Os blocos em azul são programas de sombreamento executados no nível da GPU.
  • Os blocos em verde são executados na CPU, driver, em conjunto com a GPU.
  • Os diamantes em cinza são condições que podem ocorrer quando um raio passa pela cena.

Agora, neste diagrama há um elemento que não está incluído e é por enquanto um dos maiores problemas que existem em relação ao Ray Tracing: o caminho da estrutura de aceleração. E o que é isso? Já falamos sobre isso em nossos tutoriais de rastreamento de raios, mas nunca é demais lembrar.

Estruturas de dados para acelerar o rastreamento de raios

Árbol BVH

Para acelerar e, portanto, executar mais rápido os algoritmos de traçado de raio, o que se faz é mapear a posição dos objetos na cena em uma estrutura de dados, que tem o formato de uma árvore binária do que a GPU. teria que ir.

Para que você entenda o processo de passagem pela estrutura de dados, o que se faz é partir da raiz que representa toda a cena e é especificada por níveis até chegar ao último nível. Em cada nível o que se faz é fazer um pedido ao Núcleo RT ou unidade equivalente para calcular se existe um cruzamento, se houver desce para o próximo nível, se não houver então esse caminho para por completo. Isso é feito até chegar ao final da árvore, que é onde a interseção do raio-caixa não é mais feita e a interseção do raio-polígono é realizada.

Se você foi perspicaz, terá visto que no diagrama da seção anterior entre os tipos de sombreador temos os de interseção, mas não os encarregados de percorrer a árvore BVH, ou seja, de percorrê-los, embora seja entendi que essa tarefa é realizada pelos shaders das unidades, embora não haja um tipo específico de shader para ela.

Os Traversal Shaders, o que são e qual é a sua origem?

Na documentação do DirectX Ray Tracing, podemos encontrar entre os futuros os chamados Traversal Shaders, que serão adicionados futuramente ao pipeline do Ray Tracing em uma versão posterior da API da Microsoft, mas o melhor é nos colocarmos na situação.

O exercício de percorrer a estrutura de dados até agora apesar do fato de ser um programa de shader, este é genérico e é controlado pelo driver gráfico, portanto os programadores não precisam fazer nada, pois é bem entendido que o shader de travessia dá o controle de código do aplicativo para passar pelo processo de atravessar a estrutura de dados nó por nó.

E quais benefícios isso traz para o desempenho? A principal delas é que podemos definir cenários em que um ou mais raios são descartados antes de fazer a interseção, o que não é possível no momento. Um exemplo muito claro seria enfrentar objetos muito distantes da câmera, nos quais os detalhes de iluminação não podem ser tão apreciados quanto de perto. Deve-se levar em consideração que na versão atual da API de Redmond podemos definir em relação à iluminação indireta se um objeto emite raios ou não através do Ray Generation Shader, mas não podemos criar cenários onde possamos descartar os raios por vôo , especialmente com a distância.

Shaders transversais para construir a estrutura de dados espaciais

Transversal Shaders

A divisão de R&D gráfica da Intel apresentou em 2020 um documento intitulado Construção lenta de estruturas de aceleração com shaders transversais e aqueles de vocês que têm um pouco de domínio da linguagem de Shakespeare terão deduzido que ela consiste na construção das mesmas estruturas de dados espaciais fazendo uso de Transversal Shaders. Portanto, eles podem ser usados ​​não apenas para controlar o curso, mas também para construí-lo.

A primeira coisa que se destaca é o Lazy Build, que poderíamos traduzir ser educado como um build com pouco esforço. E em que consiste? Bem, o que essa técnica busca é que o tempo de construção da estrutura de dados seja reduzido. Para isso, se baseia em informações prévias de frames anteriores adicionadas a um algoritmo de visibilidade e se isso parece confuso, vamos definir o que significa visibilidade quando falamos em renderização 3D.

Visibilidade

Temos que partir do princípio de que quando uma GPU está renderizando o que ela faz é calcular a visibilidade entre um ponto no espaço e a primeira superfície visível em uma determinada direção ou, para simplificar: a visibilidade entre dois elementos. Antes de continuar, temos que levar em conta uma coisa, certamente ao ler isto você se imaginou olhando para dois objetos. Bem, a coisa não é assim, estamos falando sobre como um objeto veria outro se pudesse ver, mas da definição mais simples refere-se à câmera, que é a vista da qual representamos.

Na renderização híbrida que combina rasterização com traçado de raio, que agora é usado por todos os jogos, a visibilidade da câmera não é calculada a partir desse algoritmo, mas sim com o algoritmo de raster. A ideia para o futuro é que a visibilidade em relação à câmera seja feita a partir do Ray Tracing, para que com essas informações a GPU acabe construindo uma estrutura de dados de toda a cena através dos Traversal Shaders.