Sprite punti (Direct3D 9)

Il supporto per i punti sprite in Direct3D 9 consente il rendering ad alte prestazioni dei punti (sistemi particellari). Gli sprite a punti sono generalizzazioni di punti generici che consentono di eseguire il rendering di forme arbitrarie come definite dalle trame.

Controlli rendering primitivi punto

Direct3D 9 supporta parametri aggiuntivi per controllare il rendering delle sprite dei punti (primitive punto). Questi parametri consentono ai punti di essere di dimensioni variabili e hanno una mappa di trama completa applicata. Le dimensioni di ogni punto sono determinate da una dimensione specificata dall'applicazione combinata con una funzione basata sulla distanza calcolata da Direct3D. L'applicazione può specificare le dimensioni del punto come per vertice o impostando D3DRS_POINTSIZE, che si applica a punti senza dimensioni per vertice. Le dimensioni del punto vengono espresse nelle unità spaziali della fotocamera, ad eccezione di quando l'applicazione passa vertici flessibili post-trasformati (FVF). In questo caso, la funzione basata sulla distanza non viene applicata e la dimensione del punto viene espressa in unità di pixel nella destinazione di rendering.

Le coordinate della trama calcolate e usate durante il rendering dei punti dipendono dall'impostazione di D3DRS_POINTSPRITEENABLE. Quando questo valore è impostato su TRUE, le coordinate della trama vengono impostate in modo che ogni punto visualizzi la trama completa. In generale, questo è utile solo quando i punti sono significativamente maggiori di un pixel. Quando D3DRS_POINTSPRITEENABLE è impostato su FALSE, viene usata la coordinata della trama del vertice di ogni punto.

Calcoli delle dimensioni del punto

Le dimensioni del punto sono determinate da D3DRS_POINTSCALEENABLE. Se questo valore è impostato su FALSE, la dimensione del punto specificata dall'applicazione viene usata come dimensione dello spazio dello schermo (dopo la trasformazione). I vertici passati a Direct3D nello spazio dello schermo non hanno dimensioni del punto calcolate; la dimensione del punto specificata viene interpretata come dimensione dello spazio dello schermo.

Se D3DRS_POINTSCALEENABLE è TRUE, Direct3D calcola le dimensioni dello spazio dello schermo in base alla formula seguente. Le dimensioni del punto specificate dall'applicazione sono espresse nelle unità spaziali della fotocamera.

S = Vh * S i * sqrt(1/(A + B * D ₑ + C *( D ₑ² ))

In questa formula, le dimensioni del punto di input, S i, sono per vertice o il valore dello stato di rendering D3DRS_POINTSIZE. I fattori di scala dei punti, D3DRS_POINTSCALE_A, D3DRS_POINTSCALE_B e D3DRS_POINTSCALE_C, sono rappresentati dai punti A, B e C. L'altezza del viewport, V h, è il membro Height della struttura D3DVIEWPORT9 che rappresenta il viewport. D ₑ, la distanza dall'occhio alla posizione (l'occhio all'origine), viene calcolata prendendo la posizione dello spazio oculare del punto (Xₑ, Yₑ, Zₑ) e eseguendo l'operazione seguente.

D ₑ = sqrt (Xₑ² + Y ₑ² + Z ₑ²)

La dimensione massima del punto, Pmₐₓ, viene determinata prendendo la dimensione inferiore del membro MaxPointSize della struttura D3DCAPS9 o lo stato di rendering D3DRS_POINTSIZE_MAX. La dimensione minima del punto, Pmin, viene determinata eseguendo query sul valore di D3DRS_POINTSIZE_MIN. Pertanto, la dimensione finale dello spazio dello schermo, S, viene determinata nel modo seguente.

  • Se Ss > Pmₐₓ, S = Pₐₓ
  • se S < Pmin, S = P min
  • In caso contrario, S = S

Rendering dei punti

Un punto di spazio dello schermo, P = ( X, Y, Z, W), di dimensioni dello schermo S viene rasterizzato come quadrilatero dei quattro vertici seguenti.

(( X + S/2, Y + S/2, Z, W), ( X + S/2, Y - S/2, Z, W), ( X - S/2, Y- S/2, Z, W), ( X - S/2, Y + S/2, Z, W))

Gli attributi del colore del vertice vengono duplicati in ogni vertice; pertanto ogni punto viene sempre eseguito il rendering con colori costanti.

L'assegnazione di indici di trama è controllata dall'impostazione dello stato di rendering D3DRS_POINTSPRITEENABLE. Se D3DRS_POINTSPRITEENABLE è impostato su FALSE, le coordinate della trama del vertice vengono duplicate in ogni vertice. Se D3DRS_POINTSPRITEENABLE è impostato su TRUE, le coordinate della trama in corrispondenza dei quattro vertici vengono impostate sui valori seguenti.

(0.F, 0.F), (0.F, 1.F), (1.F, 0.F), (1.F, 1.F)

Vedere il diagramma seguente.

diagramma di un quadrato con vertici etichettati per i valori di coordinate (u,v) e (x,y)

Quando il ritaglio è abilitato, i punti vengono ritagliati nel modo seguente. Se il vertice supera l'intervallo di valori di profondità - MinZ e MaxZ della struttura D3DVIEWPORT9 - in cui verrà eseguito il rendering di una scena, il punto esiste all'esterno del frustum della visualizzazione e non viene eseguito il rendering. Se il punto, tenendo conto delle dimensioni del punto, è completamente esterno al riquadro di visualizzazione in X e Y, il punto non viene eseguito il rendering; i punti rimanenti vengono sottoposti a rendering. È possibile che la posizione del punto sia esterna al riquadro di visualizzazione in X o Y e sia ancora parzialmente visibile.

I punti possono o non essere correttamente ritagliati ai piani di clip definiti dall'utente. Se D3DPMISCCAPS_CLIPPLANESCALEDPOINTS non è impostato nel membro PrimitiveMiscCaps della struttura D3DCAPS9 , i punti vengono inseriti nei piani clip definiti dall'utente in base solo alla posizione del vertice, ignorando le dimensioni del punto. In questo caso, i punti ridimensionati vengono completamente sottoposti a rendering quando la posizione del vertice si trova all'interno dei piani di clip e viene eliminata quando la posizione del vertice si trova all'esterno di un piano di clip. Le applicazioni possono impedire potenziali artefatti aggiungendo una geometria di bordo ai piani clip di dimensioni massime.

Se il bit di D3DPMISCCAPS_CLIPPLANESCALEDPOINTS è impostato, i punti ridimensionati vengono ritagliati correttamente nei piani di clip definiti dall'utente.

L'elaborazione dei vertici hardware può o non supportare le dimensioni del punto. Ad esempio, se un dispositivo viene creato con D3DCREATE_HARDWARE_VERTEXPROCESSING in un dispositivo hal (hardware abstraction layer) (D3DDEVTYPE_HAL) con il membro MaxPointSize della struttura D3DCAPS9 impostato su 1.0 o 0.0, tutti i punti sono un singolo pixel. Per eseguire il rendering dei punti pixel sprite inferiori a 1.0, è necessario usare vertici FVF (trasformati e lit) vertici o elaborazione del vertice software (D3DCREATE_SOFTWARE_VERTEXPROCESSING), nel qual caso il tempo di esecuzione Direct3D emula il rendering dello sprite del punto.

Un dispositivo hardware che esegue l'elaborazione dei vertici e supporta sprite del punto - MaxPointSize impostato su maggiore di 1,0f - è necessario eseguire il calcolo delle dimensioni per gli sprite nontransformed ed è necessario impostare correttamente il per vertice o il D3DRS_POINTSIZED3DRS_POINTSIZE per vertici TL.

Per informazioni sulle regole di rendering per punti, linee e triangoli, vedere Regole di rasterizzazione (Direct3D 9).

Pipeline del vertice