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: |
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.
- Mapping alla semantica Direct3D 9
- Direct3D 9 VPOS e Direct3D 10 SV_Position
- Piani di ritaglio utente in HLSL
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.