DirectX Raytracing 1.1
O DirectX Raytracing (DXR) traz um novo nível de realismo gráfico aos videogames, anteriormente apenas atingíveis na indústria cinematográfica. Os efeitos alcançáveis pelo DXR parecem mais reais, porque, em certo sentido, são mais reais: o DXR rastreia caminhos de luz com cálculos físicos reais, o que é uma simulação muito mais precisa do que os cálculos heurísticos usados anteriormente.
Já vimos um nível sem precedentes de qualidade visual de títulos que usam o DXR 1.0 desde que o lançamos, e construímos o DXR 1.1 em resposta ao feedback do desenvolvedor, oferecendo ainda mais ferramentas para utilizar o DXR.
O DXR 1.1 é uma adição incremental à parte superior do DXR 1.0, adicionando três novos recursos principais:
- A criação de trabalho da GPU agora permite o Raytracing . Isso permite que os shaders na GPU invoquem o raytracing sem uma ida e volta de volta à CPU. Essa capacidade é útil para cenários de rastreamento de raios adaptativos, como seleção / classificação / classificação / refinamento com base em shader. Basicamente, os cenários que preparam o raytracing funcionam na GPU e a geram imediatamente.
- Os mecanismos de streaming podem carregar com mais eficiência novos shaders de raytracing, conforme necessário, quando o jogador se move pelo mundo e novos objetos se tornam visíveis.
- O raytracing em linha é uma forma alternativa de raytracing que oferece aos desenvolvedores a opção de conduzir mais do processo de raytracing, em vez de lidar com a programação de trabalho inteiramente no sistema (sombreamento dinâmico). Está disponível em qualquer estágio de sombreador, incluindo sombreadores de computação, sombreadores de pixel etc. Tanto as formas de sombreamento dinâmico quanto o alinhamento em linha do raytracing usam as mesmas estruturas de aceleração opacas.
Quando usar o raytracing em linha
O traçado de raios em linha pode ser útil por vários motivos:
- Talvez o desenvolvedor saiba que seu cenário é simples o suficiente para que a sobrecarga da programação dinâmica do shader não valha a pena. Por exemplo, uma maneira bem restrita de calcular sombras.
- Poderia ser conveniente / eficiente consultar uma estrutura de aceleração de um sombreador que não suporta raios baseados em sombreador dinâmico. Como um sombreador de computação ou pixel.
- Pode ser útil combinar o traçado de raios baseado em shader dinâmico com o formulário em linha. Alguns estágios de sombreador de rastreamento de raio, como sombreamentos de interseção e sombreadores de impacto, nem mesmo suportam raios de rastreamento por meio de traçado de raio baseado em sombreador dinâmico. Mas o formulário embutido está disponível em qualquer lugar.
- Outra combinação é mudar para o formulário embutido para obter raios recursivos simples. Isso permite que o aplicativo declare que não há recursão para o pipeline de rastreamento de raios subjacente, dado que o rastreamento de raios em linha está manipulando raios recursivos. A carga de agendamento dinâmico mais simples no sistema pode gerar melhor eficiência.
Os cenários com muitos shaders complexos funcionarão melhor com o raytracing baseado em shader dinâmico, em oposição ao uso de uber shaders em linha maciços. Enquanto isso, cenários com uma complexidade mínima de sombreamento e / ou muito poucos sombreadores funcionarão melhor com o traçado de raios em linha.
Se tudo isso parece bastante complicado, bem, é! A conclusão de alto nível é que tanto o novo traçado de raio em linha quanto o traçado de raio original baseado em shader dinâmico são valiosos para diferentes propósitos. A partir do DXR 1.1, os desenvolvedores não apenas têm a opção de escolher uma das abordagens, mas também podem combiná-las em um único renderizador. As abordagens híbridas são auxiliadas pelo fato de que ambos os tipos de rastreamento de raios DXR compartilham o mesmo formato de estrutura de aceleração e são conduzidos pela mesma máquina de estado transversal subjacente.
O melhor de tudo é que os jogadores com hardware DX12 Ultimate podem ter certeza de que, independentemente do tipo de solução Raytracing que o desenvolvedor escolher usar, eles terão uma ótima experiência.
Sombreamento de taxa variável
Variable Rate Shading (VRS) permite que os desenvolvedores variem seletivamente a taxa de sombreamento de um jogo. Isso permite que eles 'acessem' a potência da GPU em partes mais importantes do jogo para obter melhores visuais e 'retornem' a potência da GPU em áreas menos importantes de um jogo para obter melhor velocidade. O sombreamento de taxa variável também tem a vantagem de ter um custo relativamente baixo para implementar para desenvolvedores. Mais detalhes sobre o sombreamento de taxa variável podem ser encontrados em nosso
post anterior .
Shaders de malha
Os Mesh Shaders oferecem aos desenvolvedores mais capacidade de programação do que nunca. Ao trazer toda a potência da computação generalizada de GPU para o pipeline de geometria, os shaders de malha permitem que os desenvolvedores construam mundos mais detalhados e dinâmicos do que nunca.
Antes do mesh shader, o pipeline de geometria da GPU escondia a natureza paralela da execução do hardware da GPU por trás de uma abstração de programação simplificada, que apenas dava aos desenvolvedores acesso a funções aparentemente lineares do shader. Por exemplo, o desenvolvedor grava uma função de sombreador de vértice que é chamada uma vez para cada vértice em um modelo, implicando execução em série. No entanto, nos bastidores, o hardware empacota vértices adjacentes para preencher uma onda SIMD e executa 32 ou 64 funções de sombreador de vértice em paralelo em um único núcleo de sombreador. Esse modelo funcionou extremamente bem por muitos anos, mas está deixando desempenho e flexibilidade em cima da mesa, ocultando os detalhes do que o hardware realmente está fazendo dos desenvolvedores.
Os shaders de malha alteram isso, fazendo com que o processamento da geometria se comporte mais como shaders de computação. Em vez de uma única função que sombreia um vértice ou um primitivo, os shaders de malha operam em todo um grupo de threads de computação, com acesso ao grupo de memória compartilhada e recursos avançados de computação, como intrínsecos de ondas cruzadas que fornecem controle ainda mais refinado do hardware real execução. Todos esses encadeamentos trabalham juntos para sombrear uma pequena lista de triângulo indexada, chamada de 'malha'. Normalmente, haverá uma fase do shader de malha em que cada thread está trabalhando em um vértice separado, e outra fase em que cada thread trabalha em uma primitiva separada - mas esse modelo é completamente flexível, permitindo que os dados sejam compartilhados entre threads, novos vértices ou primitivas criados conforme necessário, primitivas existentes cortadas ou descartadas etc.
Junto com essa nova flexibilidade de alocação de encadeamentos, há uma flexibilidade nos formatos de dados de entrada. O sombreador de malha não usa mais o bloco Input Assembler, que era anteriormente responsável por buscar dados de índice e vértice da memória. Em vez disso, o código de sombreador é livre para ler qualquer dado necessário a partir de qualquer formato que ele goste. Isso permite novas técnicas inovadoras, como a compactação do buffer de índice ou o uso de vários buffers de índice diferentes para diferentes canais de dados de vértice. Essas abordagens podem reduzir o uso de memória e também a largura de banda de memória usada durante a renderização, aumentando assim o desempenho.
Embora seja mais flexível que o pipeline de geometria anterior, o modelo de shader de malha também é muito mais simples:
Junto com o shader de malha, vem um novo estágio opcional de shader, chamado Amplification Shader. Isso é executado antes do shader de malha, executa alguns cálculos, determina quantos grupos de encadeamentos de shader de malha são necessários e, em seguida, inicia muitos shaders de malha:
Os sombreadores de amplificação são especialmente úteis para o descarte, pois podem determinar quais malhas são visíveis, testando cada conjunto de 32 a 256 triângulos em relação a um volume delimitador geométrico, cone normal ou técnicas mais avançadas, como planos de visibilidade do portal, antes de decidir lançar um grupo de encadeamentos de shader de malha para essa malha. Anteriormente, o descarte era normalmente realizado em um nível mais grosso por malha para decidir se era necessário desenhar um objeto e também em um nível mais fino por triângulo no final do pipeline da geometria. Esse novo nível intermediário de seleção melhora o desempenho ao desenhar modelos que são apenas parcialmente ocluídos. Por exemplo, se parte de um personagem estiver na tela enquanto apenas um braço não estiver,
Comentários sobre o amostrador
O Sampler Feedback permite melhor qualidade visual, menor tempo de carregamento e menos gagueira, fornecendo informações detalhadas para permitir que os desenvolvedores carreguem apenas texturas quando necessário.
Suponha que você seja um desenvolvedor de jogos sombreando uma cena 3D complicada. A câmera se move rapidamente pela cena, fazendo com que alguns objetos sejam movidos para diferentes níveis de detalhe. Como você precisa otimizar agressivamente a memória, vincula recursos para lidar com a demanda por diferentes LODs. Talvez você use um sistema de streaming de textura; talvez ele use recursos lado a lado para manter esses gigantes mip 0s em 4K não residentes, se você não precisar deles. De qualquer forma, você tem um sombreador que prova uma textura reduzida usando um padrão de amostragem A Muito Complicado. Escolha o seu favorito, diga anisotrópico.
A amostragem neste shader faz você fazer algumas perguntas.
Qual o nível de mip que ele provou? Parece uma pergunta muito básica. Em um mundo antes do Sampler Feedback, não há maneira fácil de saber. Você poderia criar uma heurística. Você pode pensar no padrão de amostragem e fazer algumas suposições. Mas 1) você não tem tempo para isso e 2) não há como ser 100% confiável.
Onde exatamente o recurso foi amostrado? Mais especificamente, o que você realmente precisa saber é: quais peças? Pode estar no canto superior esquerdo ou no meio da textura. Seu sistema de streaming realmente se beneficiaria disso, para que você saiba quais mips serão carregados a seguir.c
O feedback do amostrador resolve isso, permitindo que um shader consulte com eficiência qual parte de uma textura
seria necessária para satisfazer uma solicitação de amostragem, sem realmente executar a operação de amostra. Essas informações podem ser inseridas no sistema de streaming de ativos do jogo, permitindo tomar decisões mais inteligentes e precisas sobre quais dados serão transmitidos a seguir. Em conjunto com o recurso de recursos lado a lado do D3D12, isso permite aos jogos renderizar texturas maiores e mais detalhadas enquanto utiliza menos memória de vídeo.
O feedback do amostrador também permite o TSS (
Texture-space shading ), uma técnica de renderização que desacopla o sombreamento de um objeto no espaço do mundo, desde a rasterização da forma desse objeto até o destino final.
O TSS é uma técnica que permite que os desenvolvedores de jogos façam cálculos de iluminação caros no espaço de objetos e os gravem em uma textura - por exemplo, algo que se parece com um desembrulhamento UVW do objeto. Como nada está sendo rasterizado, o sombreamento pode ser feito usando computação, sem o pipeline gráfico. Em uma etapa separada, vincule a textura e rasterize ao espaço da tela, executando uma amostra simples. Essa abordagem reduz o alias e permite calcular a iluminação com menos frequência do que a rasterização. A dissociação dessas duas taxas permite o uso de técnicas de iluminação mais sofisticadas em taxas de quadros mais altas.
Configuração de uma cena usando sombreamento de espaço de textura
Um obstáculo para que o TSS funcione bem é descobrir o que no espaço do objeto deve ser sombreado para cada objeto. Tudo? Isso dificilmente seria eficiente. E se apenas o lado esquerdo de um objeto estiver visível? Com o poder do feedback do amostrador, a etapa de rasterização pode simplesmente registrar quais texels estão sendo solicitados e apenas executar o caro cálculo de iluminação do aplicativo naqueles.
Agora que arranhamos a superfície ...
Se você passou por nossa leitura leve e está se perguntando quando chegaremos ao material técnico, escrevemos posts detalhados para desenvolvedores sobre o
DirectX Raytracing 1.1 ,
sombreamento de taxa variável ,
sombreadores de malha e
feedback do amostrador , o quatro recursos dentro do DX12 Ultimate.
Para os desenvolvedores de jogos, reunimos um guia detalhado
Introdução ao DirectX 12 Ultimate , que contém todos os detalhes necessários para o suporte ao DX12 Ultimate hoje, incluindo como ingressar no programa Insiders, a compilação certa, SDK, drivers , etc. Como sempre, convidamos você para o nosso canal ativo do Discord e estamos ansiosos para ajudar desenvolvedores e jogadores! discord.gg/directx