Topologie primitive

Direct3D 10 e versioni successive supporta diversi tipi primitivi (o topologie) rappresentati dal tipo enumerato D3D_PRIMITIVE_TOPOLOGY . Questi tipi definiscono il modo in cui i vertici vengono interpretati e sottoposti a rendering dalla pipeline.

Tipi primitivi di base

Sono supportati i tipi primitivi di base seguenti:

Per una visualizzazione di ogni tipo primitivo, vedere il diagramma più avanti in questo argomento in Direzione avvolgimento e Posizioni vertici iniziali.

La fase input-assembler legge i dati dai buffer dei vertici e degli indici, assembla i dati in queste primitive e quindi invia i dati alle fasi rimanenti della pipeline. È possibile usare il metodo ID3D11DeviceContext::IASetPrimitiveTopology per specificare il tipo primitivo per la fase input-assembler.

Adiacenza primitiva

Tutti i tipi primitivi Direct3D 10 e superiori (ad eccezione dell'elenco di punti) sono disponibili in due versioni: un tipo primitivo con adiacenza e un tipo primitivo senza adiacenza. Le primitive con adiacenza contengono alcuni dei vertici circostanti, mentre le primitive senza adiacenza contengono solo i vertici della primitiva di destinazione. Ad esempio, la primitiva dell'elenco di righe (rappresentata dal valore D3D_PRIMITIVE_TOPOLOGY_LINELIST ) ha una primitiva dell'elenco di righe corrispondente che include l'adiacenza (rappresentata dal valore D3D_PRIMITIVE_TOPOLOGY_LINELIST_ADJ ).

Le primitive adiacenti sono destinate a fornire altre informazioni sulla geometria e sono visibili solo tramite uno shader geometry. L'adiacenza è utile per gli shader geometry che usano il rilevamento della silhouette, l'estrusione del volume shadow e così via.

Si supponga, ad esempio, di voler disegnare un elenco di triangoli con adiacenza. Un elenco di triangoli che contiene 36 vertici (con adiacenza) produrrà 6 primitive completate. Le primitive con adiacenza (ad eccezione delle strisce di linea) contengono esattamente il doppio del numero di vertici della primitiva equivalente senza adiacenza, in cui ogni vertice aggiuntivo è un vertice adiacente.

Direzione di avvolgimento e posizioni dei vertici iniziali

Come illustrato nella figura seguente, un vertice iniziale è il primo vertice non adiacente in una primitiva. Un tipo primitivo può avere più vertici iniziali definiti, purché ognuno venga usato per una primitiva diversa. Per una striscia di triangoli con adiacenza, i vertici iniziali sono 0, 2, 4, 6 e così via. Per una striscia di linea con adiacenza, i vertici iniziali sono 1, 2, 3 e così via. Una primitiva adiacente, d'altra parte, non ha vertici iniziali.

Nella figura seguente viene illustrato l'ordinamento dei vertici per tutti i tipi primitivi che l'assembler di input può produrre.

diagramma dell'ordinamento dei vertici per i tipi primitivi

I simboli nella figura precedente sono descritti nella tabella seguente.

Simbolo Nome Descrizione
simbolo per un vertice Vertice Punto nello spazio 3D.
simbolo per la direzione di avvolgimento Direzione avvolgimento Ordine dei vertici durante l'assemblaggio di una primitiva. Può essere in senso orario o antiorario; specificare questo valore chiamando ID3D11Device1::CreateRasterizerState1.
simbolo per vertice iniziale Vertice iniziale Primo vertice non adiacente in una primitiva che contiene dati per costante.

 

Generazione di più strip

È possibile generare più strisce attraverso taglio a strisce. È possibile eseguire un taglio a strip chiamando in modo esplicito la funzione RestartStrip HLSL o inserendo un valore di indice speciale nel buffer dell'indice. Questo valore è -1, che è 0xffffffff per indici a 32 bit o 0xffff per gli indici a 16 bit. Un indice di –1 indica un 'cut' esplicito o 'restart' della striscia corrente. L'indice precedente completa la primitiva o strip precedente e l'indice successivo avvia una nuova primitiva o strip. Per altre info sulla generazione di più strip, vedi Fase geometry-shader.

Nota

È necessario un hardware di livello di funzionalità 10.0 o superiore perché non tutti gli hardware 10level9 implementano questa funzionalità.

 

Introduzione con la fase di Input-Assembler

Fasi della pipeline (Direct3D 10)