Common-Shader Core

Nel modello shader 4, tutte le fasi dello shader implementano la stessa funzionalità di base usando un core di shader comune. Inoltre, ognuna delle tre fasi dello shader (vertice, geometria e pixel) offre funzionalità univoche per ogni fase, ad esempio la possibilità di generare nuove primitive dalla fase del geometry shader o di eliminare un pixel specifico nella fase del pixel shader. Il diagramma seguente illustra come i dati passano attraverso una fase dello shader e la relazione del core common-shader con le risorse di memoria dello shader.

diagram of data flow in a shader stage

  • Dati di input: un vertex shader riceve gli input dalla fase dell'assembler di input. I pixel shader e la geometria ricevono gli input dalla fase precedente dello shader. Gli input aggiuntivi includono la semantica del valore di sistema, che vengono consumate dalla prima unità della pipeline a cui sono applicabili.
  • Dati di output: gli shader generano risultati di output da passare alla fase successiva nella pipeline. Per uno shader geometry, la quantità di output di dati di una singola chiamata può variare. Alcuni output vengono interpretati dal core common-shader (ad esempio la posizione dei vertici e l'indice della matrice di destinazione di rendering), altri sono progettati per essere interpretati da un'applicazione.
  • Codice shader: gli shader possono leggere dalla memoria, eseguire operazioni aritmetiche a virgola mobile vettoriale e integer o operazioni di controllo del flusso. Non esiste alcun limite al numero di istruzioni che è possibile implementare in uno shader.
  • Campionatori: gli esempi definiscono come campionare e filtrare le trame. Fino a 16 campionatori possono essere associati contemporaneamente a uno shader.
  • Trame: le trame possono essere filtrate usando i campionatori o lette in base ai singoli texel direttamente con la funzione intrinseca di caricamento .
  • Buffer: i buffer non vengono mai filtrati, ma possono essere letti dalla memoria in base all'elemento direttamente con la funzione intrinseca di caricamento . Fino a 128 trame e risorse buffer (combinate) possono essere associate contemporaneamente a uno shader.
  • Buffer costanti: i buffer costanti sono ottimizzati per le variabili costanti dello shader. Fino a 16 buffer costanti possono essere associati contemporaneamente a una fase dello shader. Sono progettati per un aggiornamento più frequente dalla CPU; pertanto, hanno dimensioni, layout e restrizioni di accesso aggiuntive.

Differenze tra Direct3D 9 e Direct3D 10:

  • In Direct3D 9 ogni unità shader aveva un singolo file di registrazione costante di piccole dimensioni per archiviare tutte le variabili dello shader costanti. Accomodare tutti gli shader con questo spazio costante limitato richiedeva il riciclo frequente delle costanti dalla CPU.
  • In Direct3D 10 le costanti vengono archiviate in buffer non modificabili in memoria e vengono gestite come qualsiasi altra risorsa. Non esiste alcun limite al numero di buffer costanti che un'applicazione può creare. Organizzando costanti in buffer per frequenza di aggiornamento e utilizzo, la quantità di larghezza di banda necessaria per aggiornare le costanti per contenere tutti gli shader può essere notevolmente ridotta.

Supporto integer e bit per bit

Il core dello shader comune offre un set completo di operazioni integer a 32 bit conformi a I edizione Enterprise E e bit per bit. Queste operazioni consentono una nuova classe di algoritmi negli esempi di hardware grafico includono tecniche di compressione e compressione, FFT e controllo del flusso di programma bitfield.

I tipi di dati int e uint in Direct3D 10 HLSL eseguono il mapping a interi a 32 bit nell'hardware.

Differenze tra Direct3D 9 e Direct3D 10:
Negli input del flusso Direct3D 9 contrassegnati come integer in HLSL sono stati interpretati come a virgola mobile. In Direct3D 10, gli input del flusso contrassegnati come integer vengono interpretati come integer a 32 bit.
Inoltre, i valori booleani sono ora tutti i bit impostati o tutti i bit non impostati. I dati convertiti in bool verranno interpretati come true se il valore non è uguale a 0,0f (sia zero positivo che negativo possono essere false) e false in caso contrario.

Operatori bit per bit

Il core dello shader comune supporta gli operatori bit per bit seguenti:

Operatore Funzione
~ NOT logico
<< Spostamento a sinistra
>> Spostamento a destra
& And logico
| Or logico
^ Xor logico
<<= Maiusc a sinistra Uguale a
>>= Maiusc a destra uguale a
&= E uguale
|= O uguale a
^= Xor Uguale a

Gli operatori bit per bit vengono definiti per operare solo sui tipi di dati int e uint . Se si tenta di usare operatori bit per bit su tipi di dati float o struct , verrà generato un errore. Gli operatori bit per bit seguono la stessa precedenza di C rispetto ad altri operatori.

Cast binari

Il cast tra un numero intero e un tipo a virgola mobile convertirà il valore numerico seguendo le regole di troncamento C. Eseguire il cast di un valore da un valore float a un valore int e tornare a un oggetto float è una conversione con perdita dipendente dalla precisione del tipo di dati di destinazione. Ecco alcune delle funzioni di conversione: asfloat (DirectX HLSL), asint (DirectX HLSL), asuint (DirectX HLSL).

I cast binari possono essere eseguiti anche usando funzioni intrinseche HLSL. In questo modo il compilatore reinterpreta la rappresentazione di bit di un numero nel tipo di dati di destinazione.

Modello shader 4