Condividi tramite


Uso di primitive Higher-Order (Direct3D 9)

Questa sezione illustra come usare primitive di ordine superiore nell'applicazione.

Determinazione del supporto delle primitive di Higher-Order

È possibile eseguire query sul membro DevCaps della struttura D3DCAPS9 per determinare il livello di supporto per le operazioni che coinvolgono primitive di ordine superiore. La tabella seguente elenca le funzionalità del dispositivo correlate alle primitive di ordine superiore in Direct3D 9.

Funzionalità di dispositivo Descrizione
D3DDEVCAPS_NPATCHES Il dispositivo supporta le patch N ed è basato su triangoli PN curvi (un tipo speciale di triangoli bézier cubici).
D3DDEVCAPS_QUINTICRTPATCHES Il dispositivo supporta curve bezier quintiche e linee B-spline.
D3DDEVCAPS_RTPATCHES Il dispositivo supporta patch rettangolari e triangolari (patch RT).
D3DDEVCAPS_RTPATCHHANDLEZERO Le patch RT potrebbero essere disegnate in modo efficiente usando handle zero.

 

Si noti che D3DDEVCAPS_RTPATCHHANDLEZERO non significa che è possibile disegnare una patch con handle zero. È sempre possibile disegnare una patch di handle zero, indipendentemente dal fatto che questa funzionalità del dispositivo sia impostata o meno. Quando questa funzionalità è impostata, l'architettura hardware non richiede la memorizzazione nella cache di alcuna informazione e che le patch non memorizzate nella cache (handle zero) vengano disegnate in modo efficiente come quelle memorizzate nella cache.

Patch di disegno

Direct3D 9 supporta due tipi di primitive di ordine superiore o patch. Queste patch sono denominate patch N e patch Rect/Tri. È possibile eseguire il rendering di N patch usando qualsiasi chiamata di rendering di triangoli abilitando le patch N tramite la chiamata a IDirect3DDevice9::SetNPatchMode( nSegments ) con valore nSegments maggiore di 1,0. È necessario eseguire il rendering delle patch rect/Tri usando i punti di ingresso espliciti seguenti.

È possibile utilizzare i metodi seguenti per disegnare patch.

IDirect3DDevice9::D rawRectPatch disegna una patch rettangolare di ordine elevato specificata dal parametro pRectPatchInfo usando i flussi attualmente impostati. Il parametro Handle viene usato per associare la patch a un handle, in modo che al successivo disegno della patch non sia necessario specificare pRectPatchInfo. In questo modo è possibile precomputare e memorizzare nella cache coefficienti di differenza di inoltro o altre informazioni, che a sua volta consentono chiamate successive a IDirect3DDevice9::D rawRectPatch usando lo stesso handle per l'esecuzione efficiente.

È previsto che per le patch statiche, un'applicazione imposterà il vertex shader e i flussi appropriati, fornire informazioni sulle patch nel parametro pRectPatchInfo e specificare un handle in modo che Direct3D possa acquisire e memorizzare nella cache le informazioni. L'applicazione può quindi chiamare IDirect3DDevice9::D rawRectPatch successivamente con pRectPatchInfo impostato su NULL per disegnare in modo efficiente la patch. Quando si disegna una patch memorizzata nella cache, i flussi attualmente impostati vengono ignorati. È tuttavia possibile eseguire l'override dei pNumSegs memorizzati nella cache specificando nuovi valori per pNumSegs. Inoltre, è necessario impostare lo stesso vertex shader durante il rendering di una patch memorizzata nella cache impostata al momento dell'acquisizione.

Per le patch dinamiche, i dati delle patch cambiano per ogni rendering della patch, quindi non è efficiente memorizzare nella cache le informazioni. L'applicazione può trasmettere questo valore a Direct3D impostando Handle su 0. In questo caso, Direct3D disegna la patch usando i flussi attualmente impostati e i valori pNumSegs e non memorizza nella cache alcuna informazione. Non è valido impostare contemporaneamente Handle su 0 e pPatch su NULL.

Ripecificando pRectPatchInfo per lo stesso handle, l'applicazione può sovrascrivere le informazioni memorizzate nella cache in precedenza.

IDirect3DDevice9::D rawTriPatch è simile a IDirect3DDevice9::D rawRectPatch , ad eccezione del fatto che disegna una patch di ordine elevato triangolare.

Generazione di normali e coordinate di trama

Se si usa uno shader FVF (Flexible Vertex Format), la generazione automatica di normali e coordinate di trama non è possibile.

Per le normali, è possibile fornirli direttamente o calcolarli automaticamente con Direct3D.

Le coordinate generate per le patch rettangolari sono coordinate basate su spline, come illustrato nelle illustrazioni seguenti.

illustrazione di una trama originale e della trama con coordinate basate su spline

Le coordinate generate per le patch triangolari sono coordinate basate su spline barycentriche, come illustrato nelle illustrazioni seguenti.

illustrazione di una trama originale e della trama con coordinate basate su spline barycentriche

Se un'applicazione deve modificare l'intervallo delle coordinate della trama generate, questa operazione può essere eseguita usando le trasformazioni di trama.

Primitive di ordine superiore