Condividi tramite


Supporto mesh in D3DX (Direct3D 9)

D3DX è una libreria di utilità che fornisce servizi helper. Si tratta di un livello sopra il componente Direct3D.

Mesh

D3DX implementa il costrutto mesh per caricare, modificare ed eseguire il rendering del contenuto del file con estensione x. Una mesh è fondamentalmente una raccolta di vertici che definiscono alcune geometrie e un set di indici che definiscono i visi. Esistono diversi tipi di mesh.

ID3DXBaseMesh fornisce i concetti fondamentali. ID3DXMesh eredita da ID3DXBaseMesh e aggiunge l'ottimizzazione della mesh usando la cache dei vertici per chip. ID3DXSkinInfo offre il supporto mesh con interfaccia utente.

ID3DXBaseMesh fornisce metodi per modificare ed eseguire query sugli oggetti mesh ID3DXMesh , che ereditano dalla mesh di base. Sono incluse le operazioni di adiacenza, il recupero del buffer geometry, le operazioni di blocco/sblocco (vertice e indice) e la copia, il rendering, il viso e le informazioni sui vertici.

Nota

Le interfacce ID3DXPMesh e ID3DXSPMesh (per supportare rispettivamente mesh progressive e semplificate) disponibili nelle versioni precedenti di Direct3D 9 sono state eliminate.

 

Architettura mesh

Una mesh contiene i dati per un modello complesso. Si tratta di un contenitore di dati astratto che contiene risorse come trame e materiali e attributi, ad esempio dati di posizione e adiacenza. Esistono diverse operazioni mesh che migliorano le prestazioni del disegno e l'aspetto di una superficie. Inoltre, esistono diversi altri concetti di mesh che influiranno sulla funzionalità delle operazioni mesh. Comprendere questi concetti di mesh in modo da poterli applicare migliorerà le prestazioni della mesh.

Dati oggetto Mesh

Una mesh contiene un buffer dei vertici, un buffer di indice e un buffer di attributi.

  • Il vertex buffer contiene i dati dei vertici, ovvero i vertici mesh.
  • Il buffer di indice contiene indici dei vertici per l'accesso al buffer dei vertici. Ciò può ridurre le dimensioni del buffer dei vertici riducendo i vertici duplicati. Solo una mesh indicizzata usa il buffer di indice. Se una mesh è costituita da un elenco di triangoli, ad esempio, non usa il buffer di indice.
  • Il buffer degli attributi contiene i dati dell'attributo. Gli attributi sono proprietà dei vertici mesh, in nessun ordine specifico. Una mesh D3DX archivia gli attributi in un gruppo di DWORDS, per ogni viso.

Tabelle degli attributi

Una tabella di attributi è una rappresentazione concisa del contenuto di un buffer di attributi. Le tabelle degli attributi possono essere create chiamando uno dei metodi Optimize con D3DXMESHOPT_ATTRSORT, bloccando il buffer degli attributi e riempindolo di dati o chiamando SetAttributeTable. Una mesh contiene una tabella di attributi quando la mesh viene riordinata in gruppi. Ciò si verifica quando viene chiamato Optimize, presupponendo che venga fornita un'opzione di ordinamento degli attributi (D3DXMESHOPT_ATTRSORT o versione successiva). Le mesh D3DX usano elenchi di triangoli indicizzati e vengono quindi disegnate con IDirect3DDevice9::D rawIndexedPrimitive.

Le tabelle degli attributi vengono create in seguito alla chiamata di Optimize. I visi non devono essere adiacenti, perché Optimize li riordina in modo che siano adiacenti. Ad esempio, le mani di una mesh umana potrebbero usare lo stesso attributo. L'ID consente di ordinare i visi in gruppi. Le mesh dai file con estensione x hanno generato automaticamente attributi per le proprietà di materiale e trama. Per ottenere prestazioni ottimali, è necessario chiamare Optimize(ATTRSORT) o Optimize(VERTEXCACHE) più efficace. Le funzioni di caricamento tentano di presentare i dati nel formato esatto in cui sono stati salvati. Se si usa una mesh basata su buffer vertex/index buffer, l'API mesh fornisce funzioni di ottimizzazione e trasformazioni di interfaccia con un sovraccarico ridotto.

I tipi di ottimizzazione sono cumulativi, a partire dal meno ottimale (D3DXMESHOPT_COMPACT) al più ottimale (D3DXMESHOPT_IGNOREVERTS). D3DXMESHOPT_STRIPREORDER esegue una compattazione e un ordinamento di attributi. D3DXMESHOPT_VERTEXCACHE è sempre consigliato, anche nei dispositivi senza una vera cache dei vertici.

Dati applicazione

I dati dell'applicazione sono dati mesh gestiti da un'applicazione. Esiste un accoppiamento stretto tra i dati dei vertici mesh e i dati gestiti da questi buffer.

Il buffer dei materiali contiene n materiali. I materiali vengono restituiti dalla funzione Load quando viene caricato il file x. Ogni subset può avere materiali e trame propri. Il buffer dei materiali è statico.

Il buffer di adiacenza contiene informazioni sui bordi, i visi e i visi adiacenti. Alcune operazioni mesh dipendono dal sapere quali visi sono adiacenti l'uno all'altro. Queste informazioni, denominate dati di adiacenza, vengono mantenute in un buffer di adiacenza. Non fa parte della mesh ma viene gestita dall'applicazione e deve essere fornita ai metodi mesh quando necessario.

Il buffer dell'istanza degli effetti contiene un elenco di istanze dell'effetto. Un'istanza dell'effetto archivia lo stato. Queste informazioni sullo stato vengono usate per inizializzare la pipeline. Un'istanza dell'effetto contiene coppie nome-valore in un effetto.

Argomenti relativi alle mesh avanzate

Le mesh ottimizzate si basano sulla funzionalità della mesh di base e aggiungono funzionalità di ottimizzazione della cache dei vertici con due metodi: Optimize, che crea una nuova mesh e OptimizeInPlace, che modifica la mesh originale.

D3DXGeneratePMesh usa l'algoritmo di semplificazione D3DX per generare una mesh progressiva dalla mesh di input. D3DXSimplifyMesh genera una mesh standard del livello di dettaglio specificato da una mesh di input usando lo stesso algoritmo di semplificazione. L'utente ha il controllo sulla metrica di errore usata tramite i pesi specificati per componente e pesi per vertice specificati per vertice. I pesi per componente vengono moltiplicati rispetto a quella parte di componenti di errore calcolata per compressione dei bordi. I pesi per vertice vengono moltiplicati rispetto al valore della metrica di errore determinato per la rimozione del vertice. Ad esempio, se non si vuole mai rimuovere un vertice, impostare il peso di un vertice specifico su un valore elevato. Viceversa, se si vuole rimuoverlo in precedenza, impostarlo su un valore piccolo (minore di 1).

ID3DXSkinInfo supporta caratteri con interfaccia utente. Un carattere skinned è definito da un set di mesh e da un set di ossa che influiscono sui vertici delle mesh. Le ossa sono rappresentate come gerarchia di trasformazione. Per ogni mesh, c'è una matrice per ogni osso che lo colpisce, che trasforma la mesh nello spazio delle coordinate locali dell'osso. Questa matrice è la trasformazione dello spazio osseo dell'osso per la mesh. Questo valore viene definito nel momento in cui lo scheletro è associato alla mesh nel processo di creazione.

Scuoiatura

La pelle è una tecnica per trasformare i vertici mesh usando le ossa. Le ossa sono in genere disposte in uno scheletro gerarchico, molto simile alle ossa in un corpo umano. I vertici dell'oggetto vengono quindi associati alle ossa, come l'associazione della pelle alle ossa. Quando le ossa vengono trasformate, anche la pelle viene trasformata.

Le mesh skinned usano le ossa per influenzare un certo numero di vertici. I dati di trasformazione delle ossa vengono forniti dall'utente, per influenzare come SRT le ossa. La mesh utilizza le ossa trasformate per influenzare i vertici associati alle ossa. Le tavolozze sono matrici di trasformazioni SRT. Le tavolozze vengono spesso implementate come matrici, ma possono contenere valori SRT.

Taglio progressivo mesh

Le aree di dettaglio basse possono permettersi di perdere vertici che non modificano l'aspetto sottoposto a rendering della superficie. Questo è particolarmente vero per gli oggetti mentre si spostano più lontano dalla fotocamera. Questa operazione viene definita livello di dettaglio. Gli utenti hanno controlli di rendering a livello di API per impostare il livello di dettaglio per ottimizzare l'efficienza di rendering.

Gli oggetti mesh progressivi iniziano con un numero elevato di visi e usano la semplificazione per ridurre il numero di visi. Una mesh progressiva che è indipendente dalla visualizzazione viene definita mesh progressiva indipendente dalla visualizzazione (VIPM).

Un altro modo per ridurre il numero di visi consiste nel tagliare. In questo modo, i vertici e i visi vengono rimossi dalla mesh. Il taglio può essere eseguito all'estremità alta (per limitare il numero massimo di visi) o alla fine bassa (per limitare il numero minimo di visi). Il taglio migliora le prestazioni di disegno, tuttavia, è consigliabile usare la cura per mantenere la qualità visiva. Il trimming è illustrato nell'esempio Progressive Mesh SDK.

Per le aree ad alta visibilità, la risoluzione può essere aumentata usando il livello progressivo di dettaglio (PLOD). Questa è una tecnica per suddividere un singolo viso in due facce.

Patch Meshes

Sono supportati anche due tipi specializzati di mesh di patch: rettangolo e patch di triangolo. La mesh di patch rettangolo è una mesh di patch i cui punti di controllo sono disposti in una sequenza rettangolare a avvolgimento. Le patch rettangolo e triangolo vengono usate per creare superfici di ordine elevato. Non vengono usati comunemente come mesh di triangoli.

D3DX