semantica

Una semantica è una stringa collegata a un input o a un output dello shader che fornisce informazioni sull'uso previsto di un parametro. La semantica è necessaria per tutte le variabili passate tra le fasi dello shader. La sintassi per l'aggiunta di una semantica a una variabile shader è illustrata qui (sintassi delle variabili (DirectX HLSL)).

In generale, i dati passati tra le fasi della pipeline sono completamente generici e non vengono interpretati in modo univoco dal sistema; semantica arbitraria sono consentite che non hanno un significato speciale. I parametri (in Direct3D 10 e versioni successive) che contengono queste semantiche speciali vengono definiti semantica a valore di sistema.

Semantica supportata in Direct3D 9 e Direct3D 10 e versioni successive

I tipi di semantica seguenti sono supportati sia in Direct3D 9 che in Direct3D 10 e versioni successive.

Semantica vertex shader

Queste semantiche hanno un significato quando sono collegate a un parametro vertex-shader. Queste semantiche sono supportate sia in Direct3D 9 che in Direct3D 10 e versioni successive.

Input Descrizione Tipo
BINORMAL[n] Binormal float4
BLENDINDICES[n] Indici blend uint
BLENDWEIGHT[n] Sfumare i pesi float
COLOR[n] Colore diffuso e speculare float4
NORMAL[n] Vettore normale float4
POSITION[n] Posizione del vertice nello spazio degli oggetti. float4
POSITIONT Posizione dei vertici trasformata. float4
PSIZE[n] Dimensione del punto float
TANGENT[n] Tangente float4
TEXCOORD[n] Coordinate delle trame float4
Output Descrizione Tipo
COLOR[n] Colore diffuso o speculare float4
NEBBIA Nebbia vertice float
POSITION[n] Posizione di un vertice nello spazio omogeneo. Posizione di calcolo nello spazio dello schermo dividendo (x,y,z) per w. Ogni vertex shader deve scrivere un parametro con questa semantica. NOTA: questa semantica è disponibile in Direct3D 9. Per Direct3D 10 e versioni successive, usare invece SV_Position. float4
PSIZE Dimensione del punto float
TESSFACTOR[n] Fattore di tassellatura float

n è un numero intero facoltativo compreso tra 0 e il numero di risorse supportate. Ad esempio, POSITION0, TEXCOORD1 e così via.

Semantica del pixel shader

Queste semantiche hanno un significato quando sono collegate a un parametro di input pixel-shader. Queste semantiche sono supportate sia in Direct3D 9 che in Direct3D 10 e versioni successive.

Input Descrizione Tipo
COLOR[n] Colore diffuso o speculare. float4
TEXCOORD[n] Coordinate delle trame float4
VFACE Scalare a virgola mobile che indica una primitiva rivolta verso il retro. Un valore negativo si trova all'indietro, mentre un valore positivo affronta la fotocamera.

Nota:
Questa semantica è disponibile in Direct3D 9 Shader Model 3.0. Per Direct3D 10 e versioni successive, usare invece SV_IsFrontFace .


float
VPOS Posizione del pixel (x,y) nello spazio dello schermo. Per convertire uno shader Direct3D 9 (che usa questa semantica) in uno shader Direct3D 10 e versioni successive, vedere Direct3D 9 VPOS e Direct3D 10 SV_Position) float2
Output Descrizione Tipo
COLOR[n] Colore di output float4
DEPTH[n] Profondità output float

n è un numero intero facoltativo compreso tra 0 e il numero di risorse supportate. Ad esempio, PSIZE0, COLOR1 e così via.

La semantica COLOR è valida solo in modalità di compatibilità shader, ovvero quando lo shader viene creato usando D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY.

Semantica supportata solo per Direct3D 10 e versioni successive.

I tipi di semantica seguenti sono stati introdotti di recente per Direct3D 10 e non sono disponibili per Direct3D 9.

Semantica del valore di sistema

La semantica dei valori di sistema è una novità di Direct3D 10. Tutti i valori di sistema iniziano con un prefisso SV_, un esempio comune è SV_POSITION, interpretato dalla fase del rasterizzatore. I valori di sistema sono validi in altre parti della pipeline. Ad esempio, SV_Position può essere specificato come input per un vertex shader e un output. I pixel shader possono scrivere solo in parametri con la semantica SV_Depth e SV_Target valore di sistema.

Altri valori di sistema (SV_VertexID, SV_InstanceID, SV_IsFrontFace) possono essere immessi solo nel primo shader attivo nella pipeline che può interpretare il valore specifico; dopo che la funzione shader deve passare i valori alle fasi successive.

SV_PrimitiveID è un'eccezione a questa regola di input solo nel primo shader attivo nella pipeline che può interpretare il valore specifico; l'hardware può fornire lo stesso valore ID dell'input per la fase hull-shader, la fase domain-shader e dopo quella fase abilitata: fase geometry-shader o fase pixel-shader.

Se la tassellatura è abilitata, sono presenti la fase hull-shader e la fase domain-shader. Per una determinata patch, lo stesso PrimitiveID si applica alla chiamata hull-shader della patch e a tutte le chiamate di domain shader a mosaico. Lo stesso PrimitiveID si propaga anche alla fase attiva successiva; fase geometry-shader o fase pixel-shader, se abilitata.

Se l'input dello shader geometry SV_PrimitiveID e perché può restituire zero o una o più primitive per ogni chiamata, lo shader deve programmare la propria scelta di SV_PrimitiveID valore per ogni primitiva di output se un successivo input di pixel shader SV_PrimtiveID.

Come altro esempio, SV_PrimitiveID non può essere interpretato dalla fase vertex-shader perché un vertice può essere un membro di più primitive.

Queste semantiche sono state aggiunte a Direct3D 10; non sono disponibili in Direct3D 9.

Semantica del valore di sistema per la fase del rasterizzatore.

Semantica del valore di sistema Descrizione Tipo
SV_ClipDistance[n] Ritaglia dati distanza. SV_ClipDistance valori vengono considerati una distanza float32 con segno a un piano. La configurazione primitiva richiama solo la rasterizzazione sui pixel per cui le distanze del piano interpolato sono >= 0. È possibile implementare più piani di ritaglio contemporaneamente dichiarando più componenti di uno o più elementi vertice come SV_ClipDistance. I valori di distanza combinata di clip e cull sono al massimo componenti D3D#_CLIP_OR_CULL_DISTANCE_COUNT al massimo nei registri D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT. Disponibile per tutti gli shader in cui leggere o scrivere, ad eccezione del vertex shader che può scrivere il valore, ma non come input.
L'attributo clipplanes funziona come SV_ClipDistance, ma funziona a livello di funzionalità hardware 9_x e superiore. Per altre info, vedi Piani clip utente su hardware di livello 9.
float
SV_CullDistance[n] Dati sulla distanza Cull. Quando a questa etichetta vengono assegnati i componenti degli elementi dei vertici, questi valori vengono considerati come una distanza con segno float32 a un piano. Le primitive verranno eliminate completamente se le distanze del piano per tutti i vertici nella primitiva sono < 0. È possibile usare più piani cull contemporaneamente dichiarando più componenti di uno o più elementi vertice come SV_CullDistance. I valori di distanza combinata di clip e cull sono al massimo componenti D3D#_CLIP_OR_CULL_DISTANCE_COUNT al massimo nei registri D3D#_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT. Disponibile per tutti gli shader in cui leggere o scrivere, ad eccezione del vertex shader che può scrivere il valore, ma non come input.
float
SV_Coverage Maschera che può essere specificata in input, output o in entrambi i pixel shader.
Per SV_Coverage in un pixel shader, OUTPUT è supportato in ps_4_1 o versione successiva.
Per SV_Coverage in un pixel shader, INPUT richiede ps_5_0 o superiore.
uint
SV_Depth Dati del buffer di profondità. Può essere scritto da pixel shader. float
SV_DepthGreaterEqual In un pixel shader, consente la profondità di output, purché sia maggiore o uguale al valore determinato dal rasterizzatore. Abilita la regolazione della profondità senza disabilitare la Z anticipata. float
SV_DepthLessEqual In un pixel shader, consente la profondità di output, purché sia minore o uguale al valore determinato dal rasterizzatore. Abilita la regolazione della profondità senza disabilitare la Z anticipata. float
SV_DispatchThreadID Definisce l'offset del thread globale all'interno della chiamata Dispatch, per dimensione del gruppo. Disponibile come input per il calcolo dello shader. (sola lettura) uint3
SV_DomainLocation Definisce la posizione sullo scafo del punto di dominio corrente da valutare. Disponibile come input per lo shader del dominio. (sola lettura) float2|3
SV_GroupID Definisce l'offset del gruppo all'interno di una chiamata Dispatch, per dimensione della chiamata dispatch. Disponibile come input per lo shader di calcolo. (sola lettura) uint3
SV_GroupIndex Fornisce un indice flat per un determinato thread all'interno di un determinato gruppo. Disponibile come input per lo shader di calcolo. (sola lettura) uint
SV_GroupThreadID Definisce l'offset del thread all'interno del gruppo, per dimensione del gruppo. Disponibile come input per lo shader di calcolo. (sola lettura) uint3
SV_GSInstanceID Definisce l'istanza dello shader geometry. Disponibile come input per lo shader geometry. L'istanza è necessaria perché uno shader geometry può essere richiamato fino a 32 volte sulla stessa primitiva geometry. uint
SV_InnerCoverage Rappresenta informazioni di rasterizzazione conservativa sottovalutate (ad esempio se un pixel è garantito da coprire completamente). Può essere letto o scritto dal pixel shader.
SV_InsideTessFactor Definisce la quantità di tassellatura all'interno di una superficie di patch. Disponibile nello hull shader per la scrittura e disponibile nello shader del dominio per la lettura. float|float[2]
SV_InstanceID Identificatore per istanza generato automaticamente dal runtime (vedere Uso dei valori generati dal sistema (Direct3D 10)). Disponibile per tutti gli shader.
SV_IsFrontFace Specifica se un triangolo è rivolto verso il lato anteriore. Per linee e punti, IsFrontFace ha il valore true. L'eccezione è costituita da linee disegnate da triangoli (modalità wireframe), che imposta IsFrontFace allo stesso modo della rasterizzazione del triangolo in modalità continua. Può essere scritto in dal geometry shader e letto dal pixel shader. bool
SV_OutputControlPointID Definisce l'indice dell'ID del punto di controllo utilizzato da una chiamata del punto di ingresso principale dello hull shader. Può essere letto solo dallo hull shader. uint
SV_Position Quando SV_Position viene dichiarato per l'input in uno shader, può avere una delle due modalità di interpolazione specificate: linearNoPerspective o linearNoPerspectiveCentroid, in cui quest'ultimo fa sì che i valori xyzw centroidi vengano forniti quando si esegue l'anti-aliasing multisample. Se usato in uno shader, SV_Position descrive la posizione del pixel. Disponibile in tutti gli shader per ottenere il centro pixel con offset 0,5. float4
SV_PrimitiveID Identificatore per primitivo generato automaticamente dal runtime (vedere Uso dei valori generati dal sistema (Direct3D 10)). Può essere scritto in dai geometry o pixel shader e letto dagli shader geometry, pixel, hull o domain shader. uint
SV_RenderTargetArrayIndex Indice della matrice di destinazione di rendering. Applicato all'output geometry shader e indica la sezione della matrice di destinazione di rendering a cui verrà disegnata la primitiva dal pixel shader. SV_RenderTargetArrayIndex è valido solo se la destinazione di rendering è una risorsa di matrice. Questa semantica si applica solo alle primitive; se una primitiva ha più vertici, viene usato il valore del vertice iniziale. Questo valore indica anche quale sezione di matrice di una visualizzazione depth/stencil viene usata per scopi di lettura/scrittura.
Può essere scritto dallo shader geometry e letto dal pixel shader.
Se D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer è true, SV_RenderTargetArrayIndex viene applicato a qualsiasi shader che alimenta il rasterizzatore.
uint
SV_SampleIndex Dati dell'indice di frequenza di esempio. Disponibile per essere letto o scritto solo dal pixel shader. uint
SV_StencilRef Rappresenta il valore di riferimento dello stencil pixel shader corrente. Può essere scritto solo dal pixel shader. uint
SV_Target[n], dove 0 <= n <= 7 Valore di output che verrà archiviato in una destinazione di rendering. L'indice indica in quale delle 8 destinazioni di rendering eventualmente associate da scrivere. Il valore è disponibile per tutti gli shader. float[2|3|4]
SV_TessFactor Definisce la quantità di tassellatura su ogni bordo di una patch. Disponibile per la scrittura nello hull shader e la lettura nello shader del dominio. float[2|3|4]
SV_VertexID Identificatore per vertice generato automaticamente dal runtime (vedere Uso dei valori generati dal sistema (Direct3D 10)). Disponibile solo come input per il vertex shader. uint
SV_ViewportArrayIndex Indice della matrice viewport. Applicato all'output geometry shader e indica il riquadro di visualizzazione da usare per la primitiva attualmente in fase di scrittura. Può essere letto dal pixel shader. La primitiva verrà trasformata e ritagliata sul riquadro di visualizzazione specificato dall'indice prima che venga passata al rasterizzatore. Questa semantica si applica solo alle primitive; se una primitiva ha più vertici, viene usato il valore del vertice iniziale.
Se D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer è true, SV_ViewportArrayIndex viene applicato a qualsiasi shader che alimenta il rasterizzatore.
uint
SV_ShadingRate Definisce, tramite valori di frequenza di ombreggiatura, il numero di pixel scritti da una chiamata al pixel shader per i dispositivi di livello 2 o superiore della frequenza di ombreggiatura variabile. Può essere letto dal pixel shader. Può essere scritto da un vertice o da uno shader geometry. uint

Limitazioni durante la scrittura di SV_Depth:

  • Quando si esegue il multicampionamento (MultisampleEnable è TRUE in D3D10_RASTERIZER_DESC) e si scrive un valore di profondità (usando un pixel shader), viene usato anche il singolo valore scritto nel test di profondità, quindi la possibilità di eseguire il rendering dei bordi primitivi a una risoluzione superiore viene persa quando si esegue il multicampionamento.
  • Quando si usa il controllo del flusso dinamico, è impossibile determinare in fase di compilazione se uno shader che scrive SV_Depth in alcuni percorsi sarà garantito di scrivere SV_Depth in ogni esecuzione. Non è possibile scrivere SV_Depth quando i risultati dichiarati hanno un comportamento non definito (che può o non includere l'eliminazione del pixel).
  • Qualsiasi valore float32 incluso +/-INF e NaN può essere scritto in SV_Depth.
  • La scrittura di SV_Depth è ancora valida quando si esegue la fusione dei colori a doppia origine.

Migrazione da Direct3D 9 a Direct3D 10 e versioni successive

Quando si esegue la migrazione del codice da Direct3D 9 a Direct3D 10 e versioni successive, è necessario considerare i problemi seguenti:

Mapping alla semantica Direct3D 9

Alcune semantiche direct3D 10 e successive eseguono il mapping diretto alla semantica Direct3D 9.

Semantica Direct3D 10 Semantica equivalente di Direct3D 9
SV_Depth DEPTH
SV_Position POSITION
SV_Target COLORE

[!] Nota per gli sviluppatori Direct3D 9: per le destinazioni Direct3D 9, la semantica dello shader deve essere mappata alla semantica Direct3D 9 valida. Per la compatibilità con le versioni precedenti, FXC considera POSITION0 (e i relativi nomi di variante) come SV_Position. FXC considera COLOR come SV_TARGET. DXC e i compilatori più recenti considerano POSITION[n] e COLOR come semantica definita dall'utente.

Direct3D 9 VPOS e Direct3D 10 SV_Position

La semantica D3D10 SV_Position offre funzionalità simili alla semantica VPOS del modello direct3D 9 shader 3. Ad esempio, in Direct3D 9 viene usata la sintassi seguente per un pixel shader usando le coordinate dello spazio dello schermo:

float4 psMainD3D9( float4 screenSpace : VPOS ) : COLOR
{
    // code here 
}

VPOS è stato aggiunto per il supporto del modello di shader 3, per specificare le coordinate dello spazio dello schermo, poiché la semantica POSITION era destinata alle coordinate dello spazio degli oggetti.

In Direct3D 10 e versioni successive, la semantica SV_Position (se usata nel contesto di un pixel shader) specifica le coordinate dello spazio dello schermo (offset di 0,5). Di conseguenza, lo shader Direct3D 9 sarebbe approssimativamente equivalente (senza tenere conto dell'offset 0,5) al seguente:

float4 psMainD3D10( float4 screenSpace : SV_Position ) : COLOR
{
    // code here
}

Quando si esegue la migrazione da Direct3D 9 a Direct3D 10 e versioni successive, è necessario tenere presente questo problema durante la conversione degli shader.

Piani di ritaglio utente in HLSL

A partire da Windows 8, è possibile usare l'attributo della funzione Clipplanes in una dichiarazione di funzione HLSL anziché SV_ClipDistance per rendere il lavoro dello shader a livello di funzionalità 9_x nonché il livello di funzionalità 10 e superiore. Per altre info, vedi Piani clip utente su hardware di livello 9.