Utilizzo delle Primitive Higher-Order (Direct3D 9)
Questa sezione illustra come usare primitive di ordine superiore nell'applicazione.
- determinare Higher-Order supporto primitivo
- Segmenti di Disegno
- generazione di normali e coordinate di trama
Determinazione del supporto primitivo 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à del 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 le curve di Bezier quintiche e le B-splines. |
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.
Creazione di patch
Direct3D 9 supporta due tipi di primitive di ordine superiore o patch. Queste patch sono denominate N-Patches e Rect/Tri patches. È possibile eseguire il rendering delle N-patch utilizzando qualsiasi chiamata di rendering di triangoli abilitando le N-patch tramite la chiamata a IDirect3DDevice9::SetNPatchMode(nSegments) con un valore di nSegments maggiore di 1.0. È necessario eseguire il rendering delle patch rect/Tri usando i punti di ingresso espliciti seguenti.
Per disegnare patch, è possibile utilizzare i metodi seguenti.
- IDirect3DDevice9::DrawRectPatch. Per comprendere meglio come i dati della patch sono referenziati nel buffer dei vertici, vedere D3DRECTPATCH_INFO.
- IDirect3DDevice9::DrawTriPatch. Per comprendere meglio come viene fatto riferimento ai dati della patch nel vertex buffer, vedere D3DTRIPATCH_INFO.
IDirect3DDevice9::DrawRectPatch disegna una patch rettangolare di alto ordine specificata dal parametro pRectPatchInfo utilizzando i flussi correnti. 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 cachare i coefficienti di differenza progressiva o altre informazioni, che a loro volta consentono chiamate successive a IDirect3DDevice9::DrawRectPatch usando lo stesso handle per l'esecuzione efficiente.
È destinato alle patch statiche, un'applicazione imposta il vertex shader e i flussi appropriati, fornisce informazioni sulle patch nel parametro pRectPatchInfo e specifica un handle in modo che Direct3D possa acquisire e memorizzare nella cache le informazioni. L'applicazione può quindi chiamare IDirect3DDevice9::DrawRectPatch successivamente, con pRectPatchInfo impostato su NULL, per disegnare la patch in modo efficiente. 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 come è stato impostato quando è stato acquisito.
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ò comunicare 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 informazioni. Non è valido impostare contemporaneamente Handle su 0 e pPatch su NULL.
Specificando pRectPatchInfo per lo stesso handle, l'applicazione può sovrascrivere le informazioni memorizzate nella cache in precedenza.
IDirect3DDevice9::DrawTriPatch è simile a IDirect3DDevice9::DrawRectPatch, tranne che disegna una patch ad 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.
Le coordinate generate per le patch triangolari sono coordinate bari-centriche basate su spline, come mostrato nelle figure seguenti.
Se un'applicazione deve modificare l'intervallo delle coordinate della trama generate, questa operazione può essere eseguita usando le trasformazioni di trama.
Argomenti correlati