Share via


Piani clip utente a livello di funzionalità 9 hardware

A partire da Windows 8, Microsoft High Level Shader Language (HLSL) supporta una sintassi che è possibile usare con l'API Microsoft Direct3D 11 per specificare i piani di clip utente a livello di funzionalità 9_x e versioni successive. È possibile usare questa sintassi clip-planes per scrivere uno shader e quindi usare tale oggetto shader con l'API Direct3D 11 per l'esecuzione su tutti i livelli di funzionalità Direct3D.

Sfondo

È possibile accedere ai piani clip utente nell'API Microsoft Direct3D 9 tramite IDirect3DDevice9::SetClipPlane e IDirect3DDevice9::GetClipPlane. In Microsoft Direct3D 10 e versioni successive è possibile accedere ai piani clip utente tramite la semantica SV_ClipDistance . Ma prima di Windows 8, SV_ClipDistance non era disponibile per l'hardware a livello di funzionalità 9_x nell'API Direct3D 10 o Direct3D 11. Quindi, prima di Windows 8, l'unico modo per accedere ai piani clip utente con livello di funzionalità 9_x hardware era tramite l'API Direct3D 9. Le app direct3D di Windows Store non possono usare l'API Direct3D 9. In questo articolo viene descritta la sintassi che è possibile usare per accedere ai piani di clip utente tramite l'API Direct3D 11 a livello di funzionalità 9_x e superiore.

Le app usano piani clip per definire un set di piani invisibili all'interno del mondo 3D che ritaglia tutte le primitive disegnate. Windows non disegna alcun pixel che si trova sul lato negativo di qualsiasi piano clip. Le app possono quindi usare piani clip per eseguire il rendering di reflection planari.

Sintassi

Usare questa sintassi per dichiarare i piani clip come attributi di funzione in una dichiarazione di funzione. Ad esempio, qui viene usata la sintassi in un frammento vertex shader:

cbuffer ClipPlaneConstantBuffer 
{
       float4 clipPlane1;
       float4 clipPlane2;
};

[clipplanes(clipPlane1,clipPlane2)]
VertexShaderOutput main(VertexShaderInput input)
{
       // the rest of the vertex shader doesn't refer to the clip plane
 
       …
 
       return output;
}

Questo esempio per un frammento vertex shader indica due piani clip. Mostra che è necessario posizionare il nuovo attributo clipplanes all'interno delle parentesi quadre immediatamente prima del valore restituito del vertex shader. Tra parentesi dopo l'attributo clipplanes viene fornito un elenco di fino a 6 costanti float4 che definiscono i coefficienti del piano per ogni piano di clip attivo. L'esempio mostra anche che è necessario rendere i coefficienti di ogni piano risiede in un buffer costante.

Nota

Non è disponibile alcuna sintassi per disabilitare un piano clip in modo dinamico. È necessario ricompilare un shader diverso da nessun attributo clipplanes oppure l'app può impostare i coefficienti nel buffer costante su zero in modo che il piano non influisca più su alcuna geometria.

 

Questa sintassi è disponibile per qualsiasi destinazione vertex 4.0 o successiva, che include vs_4_0_level_9_1 e vs_4_0_level_9_3.

Creazione di piani clip nello spazio clip a livello di funzionalità 9 e superiore

Qui viene illustrato come creare piani clip nello spazio clip a livello di funzionalità 9_x e superiore.

Lettura in background

"Introduzione alla programmazione del gioco 3D con DirectX 10" di Frank D. Luna spiega lo sfondo matematico grafico (capitoli 1, 2 e 3) necessari e i vari spazi e trasformazioni spaziali che si verificano nel vertex shader (sezioni 5.6 e 5.8).

Livelli di funzionalità 10Level9

In Direct3D 10 e versioni successive è possibile ritagliarsi in qualsiasi spazio che abbia senso, spesso nello spazio mondiale o nello spazio di visualizzazione. Ma Direct3D 9 usa lo spazio clip, che è pre-prospettiva dividere lo spazio di proiezione. I vettori si trovano nello spazio clip quando il vertex shader li passa a fasi che seguono nella pipeline grafica.

Quando si scrive un'app di Windows Store, è necessario usare 10Level9 livelli di funzionalità (livello di funzionalità 9_x) in modo che l'app possa essere eseguita a livello di funzionalità 9_x e hardware superiore. Poiché l'app supporta il livello di funzionalità 9_x e superiore, è necessario usare anche la funzionalità comune di applicare piani clip nello spazio clip.

Quando si compila un vertex shader con vs_4_0_level_9_1 o versioni successive, tale vertex shader può usare l'attributo clipplanes . Un oggetto Direct3D 10 o versione successiva ha un prodotto punto del vertice generato che contiene ognuna delle costanti globali float4 specificate nell'attributo. L'oggetto Direct3D 9 dispone di metadati sufficienti per causare il runtime 10Level9 per eseguire le chiamate appropriate a IDirect3DDevice9::SetClipPlane.

Matematica del piano clip

Un piano clip è definito da un vettore con 4 componenti. I primi tre componenti definiscono un vettore x, y, z che emana dall'origine nello spazio che vogliamo ritagliare. Questo vettore implica un piano, perpendicolare al vettore e in esecuzione attraverso l'origine. Windows mantiene tutti i pixel sul lato vettore del piano e clip tutti i pixel dietro il piano. Il componente in avanti w esegue il push del piano indietro e causa la clip di Windows meno (un w negativo causa la clip di Windows più) lungo la linea vettoriale. Se x, y, i componenti z compongono un vettore di unità (normalizzato), w esegue il push del piano w unità indietro.

La matematica eseguita dall'unità di elaborazione grafica (GPU) per determinare il ritaglio è un semplice prodotto punto tra il vettore vertex (x, y, z, 1) e il vettore del piano di ritaglio. Questa operazione matematica crea una lunghezza di proiezione sul vettore del piano clip. Un prodotto punto negativo mostra il vertice da trovarsi sul lato ritagliato del piano.

Ritaglio nello spazio di visualizzazione

Ecco il vertice nello spazio di visualizzazione:

vertice nello spazio di visualizzazione

Ecco il nostro piano clip nello spazio di visualizzazione:

Piano clip nello spazio di visualizzazione

Ecco il prodotto punto del vertice e del piano clip nello spazio di visualizzazione:

ClipDistance = v · C = vCₓ +vyCy + vz z C + w w

Questa operazione matematica funziona per un oggetto Direct3D 10 o versione successiva, ma non funziona per un oggetto Direct3D 9. Per Direct3D 9, è prima necessario passare attraverso la trasformazione della proiezione in spazio clip.

Matrice di proiezione

Una matrice di proiezione trasforma un vertice dallo spazio di visualizzazione (dove l'origine è l'occhio del visualizzatore, +x è a destra, +y è su e +z è direttamente avanti) nello spazio clip. La matrice di proiezione legge il vertice per il ritaglio hardware e la fase di rasterizzazione. Ecco una matrice di prospettiva standard (altre proiezioni richiedono matematica diversa):

*r* rapporto di larghezza finestra/altezza *α* angolo di visualizzazione *f* distanza dal visualizzatore al piano lontano *n* distanza dal visualizzatore al piano vicino
! [matrice di proiezione] (images/projection-matrix.png)

La matrice successiva è una versione semplificata della matrice precedente. La matrice è semplificata in modo da poterla usare più avanti nell'operazione di moltiplicazione della matrice.

matrice di proiezione semplificata

Ora si trasforma il vertice dello spazio di visualizzazione in spazio clip con una matrice moltiplicata:

moltiplicazione matrice

Nell'operazione di moltiplicazione della matrice, i componenti x e y vengono corretti solo leggermente, ma i componenti z e w sono abbastanza mangled. Il nostro piano clip non ci darà più quello che vogliamo.

Piano clip spazio clip

Qui vogliamo creare un piano clip space clip il cui punto prodotto con il vertice dello spazio clip ci dà lo stesso valore di v · C nella sezione Ritaglio nello spazio di visualizzazione .

Piano clip

v · C = v P · C P

vCₓ +vy C y + v + = z Z C v ₓPCₓ +v y P y Cy + V v Z AyC + + P z BC P z CPw

Ora è possibile interrompere l'operazione matematica precedente in base al componente del vertice in quattro equazioni separate:

componente del vertice x del prodotto del piano clip

Componente del vertice y del prodotto del piano clip

componente del vertice del prodotto del piano clip

componente del vertice z del prodotto del piano clip

Il piano di clip dello spazio di visualizzazione e la matrice di proiezione derivano e ci danno il piano clip space clip.

Piano clip spazio

Guida alla programmazione per HLSL

Sintassi di dichiarazione di funzione