Compartilhar via


núcleo do Common-Shader

No Modelo de Sombreador 4, todos os estágios de sombreador implementam a mesma funcionalidade base usando um núcleo de sombreador comum. Além disso, cada um dos três estágios de sombreador (vértice, geometria e pixel) oferece funcionalidade exclusiva para cada estágio, como a capacidade de gerar novas primitivas do estágio do sombreador geometry ou descartar um pixel específico no estágio do sombreador de pixel. 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 de sombreador.

diagrama de fluxo de dados em um estágio de sombreador

  • de Dados de Entrada: um sombreador de vértice recebe suas entradas do estágio do assembler de entrada; os sombreadores de geometria e pixel recebem suas entradas do estágio anterior do sombreador. Entradas adicionais incluem semântica de valor do sistema, que são consumíveis pela primeira unidade no pipeline à qual são aplicáveis.
  • de Dados de Saída: os 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 de sombreador comum (como a posição do vértice e o índice render-target-array), outras foram projetadas para serem interpretadas por um aplicativo.
  • de Código do Sombreador: os sombreadores podem ler da memória, executar operações aritméticas de ponto flutuante e inteiro 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.
  • Samplers: os exemplodores definem como amostrar e filtrar texturas. Até 16 samplers podem ser associados a um sombreador simultaneamente.
  • Texturas: texturas podem ser filtradas usando amostras ou lidas por texel diretamente com a carga função intrínseca.
  • buffers: os buffers nunca são filtrados, mas podem ser lidos da memória por elemento diretamente com a carga função intrínseca. 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 de sombreador. Até 16 buffers constantes podem ser associados a um estágio de sombreador simultaneamente. Eles são projetados para uma atualização mais frequente da CPU; portanto, eles têm restrições adicionais de tamanho, layout e acesso.

Diferenças entre o Direct3D 9 e o 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 e bit a bit em conformidade com IEEE. 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.

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

Diferenças entre o Direct3D 9 e o Direct3D 10:
No Direct3D 9, as entradas de fluxo marcadas como inteiros 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
~ Não Lógico
<< Deslocamento para a esquerda
>> Deslocamento para a direita
& Lógico e
| Lógico ou
^ Xor lógico
<<= Deslocamento à esquerda igual
>>= Deslocamento à Direita Igual
&= E igual
|= Ou Igual
^= Xor Igual

Os operadores bit a bit são definidos para operar somente em tipos de dados int e uint. A tentativa de usar operadores bit a bit em float ou struct tipos de dados 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. A conversão de um valor de um flutuante, para um deint e de volta para um flutuante é uma conversão de perda dependente da precisão do tipo de dados de destino. Aqui estão algumas das funções de conversão: à tona (DirectX HLSL), asint (DirectX HLSL), asuint (DirectX HLSL).

Conversões binárias também podem ser executadas usando funções intrínsecas de 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