Common-Shader Core

No Sombreador Modelo 4, todos os estágios do sombreador implementam a mesma funcionalidade base usando um núcleo de sombreador comum. Além disso, cada um dos três estágios do sombreador (vértice, geometria e pixel) oferece funcionalidade exclusiva para cada estágio, como a capacidade de gerar novos primitivos do estágio do sombreador de geometria ou descartar um pixel específico no estágio do sombreador de pixels. O diagrama a seguir mostra como os dados fluem por um estágio de sombreador e a relação do núcleo de sombreador comum com recursos de memória do sombreador.

diagram of data flow in a shader stage

  • Dados de entrada: um sombreador de vértice recebe suas entradas do estágio do assembler de entrada; sombreadores de geometria e pixel recebem suas entradas do estágio anterior do sombreador. Entradas adicionais incluem semântica de valor de sistema, que são consumíveis pela primeira unidade no pipeline ao qual são aplicáveis.
  • Dados de saída: sombreadores geram resultados de saída a serem passados para o estágio subsequente no pipeline. Para um sombreador de geometria, a quantidade de saída de dados de uma única invocação pode variar. Algumas saídas são interpretadas pelo núcleo do sombreador comum (como a posição do vértice e o índice render-target-array), outras foram projetadas para serem interpretadas por um aplicativo.
  • Código do sombreador: os sombreadores podem ler da memória, executar operações aritméticas de ponto flutuante e inteiro de vetor ou operações de controle de fluxo. Não há limite para o número de instruções que podem ser implementadas em um sombreador.
  • Exemplos: os samplers definem como amostrar e filtrar texturas. Até 16 samplers podem ser associados a um sombreador simultaneamente.
  • Texturas: as texturas podem ser filtradas usando samplers ou lidas por texel diretamente com a função intrínseca de carga .
  • Buffers: os buffers nunca são filtrados, mas podem ser lidos da memória por elemento diretamente com a função intrínseca de carga . Até 128 recursos de textura e buffer (combinados) podem ser associados a um sombreador simultaneamente.
  • Buffers constantes: buffers constantes são otimizados para variáveis constantes do sombreador. Até 16 buffers constantes podem ser associados a um estágio de sombreador simultaneamente. Eles foram projetados para uma atualização mais frequente da CPU; portanto, eles têm restrições adicionais de tamanho, layout e acesso.

Diferenças entre Direct3D 9 e Direct3D 10:

  • No Direct3D 9, cada unidade de sombreador tinha um único arquivo de registro de constante pequeno para armazenar todas as variáveis de sombreador constante. Acomodar todos os sombreadores com esse espaço constante limitado exigia a reciclagem frequente de constantes pela CPU.
  • No Direct3D 10, as constantes são armazenadas em buffers imutáveis na memória e são gerenciadas como qualquer outro recurso. Não há limite para o número de buffers constantes que um aplicativo pode criar. Ao organizar constantes em buffers por frequência de atualização e uso, a quantidade de largura de banda necessária para atualizar constantes para acomodar todos os sombreadores pode ser significativamente reduzida.

Suporte inteiro e bit a bit

O núcleo de sombreador comum fornece um conjunto completo de operações de inteiro de 32 bits compatíveis com IEEE e bit a bit. Essas operações permitem uma nova classe de algoritmos em exemplos de hardware gráfico, incluindo técnicas de compactação e empacotamento, FFTs e controle de fluxo de programa bitfield.

Os tipos de dados int e uint no mapa HLSL do Direct3D 10 para inteiros de 32 bits no hardware.

Diferenças entre Direct3D 9 e Direct3D 10:
No direct3D 9, as entradas de fluxo marcadas como inteiro no HLSL foram interpretadas como ponto flutuante. No Direct3D 10, as entradas de fluxo marcadas como inteiro são interpretadas como um inteiro de 32 bits.
Além disso, os valores boolianos agora são todos os bits definidos ou todos os bits não definidos. Os dados convertidos em bool serão interpretados como verdadeiros se o valor não for igual a 0,0f (zero positivo e negativo tem permissão para ser falso) e false caso contrário.

Operadores bit a bit

O núcleo de sombreador comum dá suporte aos seguintes operadores bit a bit:

Operador Função
~ Not lógico
<< Turno esquerdo
>> Deslocamento para a direita
& AND lógico
| Ou lógico
^ Xor lógico
<<= Deslocamento à esquerda igual
>>= Deslocamento para a direita igual
&= E Igual
|= Ou Igual
^= Xor Igual

Os operadores bit a bit são definidos para operar apenas em tipos de dados int e uint . A tentativa de usar operadores bit a bit em tipos de dados float ou struct resultará em um erro. Os operadores bit a bit seguem a mesma precedência que C em relação a outros operadores.

Conversões binárias

A conversão entre um inteiro e um tipo de ponto flutuante converterá o valor numérico seguindo as regras de truncamento C. Converter um valor de um float, para um int e voltar para um float é uma conversão perdida dependente da precisão do tipo de dados de destino. Aqui estão algumas das funções de conversão: asfloat (DirectX HLSL), asint (DirectX HLSL), asuint (DirectX HLSL).

As conversões binárias também podem ser executadas usando funções intrínsecas HLSL. Isso faz com que o compilador reinterpreta a representação de bit de um número no tipo de dados de destino.

Modelo de sombreador 4