Condividi tramite


Elaborazione dei vertici della funzione fissa (Direct3D 9)

Nella pipeline dei vertici della funzione fissa l'elaborazione dei vertici in un buffer dei vertici applica le matrici di trasformazione correnti per il dispositivo. Le operazioni sui vertici, ad esempio l'illuminazione, la generazione di flag di clip e l'aggiornamento degli extent, possono essere applicate, facoltativamente. Quando si usa l'elaborazione dei vertici di funzione fissa, la modifica degli elementi nel buffer dei vertici di destinazione viene controllata dal flag D3DPV_DONOTCOPYDATA . Questo flag si applica solo all'elaborazione dei vertici della funzione fissa. L'interfaccia IDirect3DDevice9 espone il metodo IDirect3DDevice9::P rocessVertices per elaborare i vertici. I vertici vengono elaborati da un vertex shader al set di flussi di dati di input, generando un singolo flusso di dati dei vertici interleaved nel buffer dei vertici di destinazione chiamando il metodo IDirect3DDevice9::P rocessVertices . Il metodo accetta cinque parametri che descrivono la posizione e la quantità di vertici di destinazione del metodo, il buffer dei vertici di destinazione e le opzioni di elaborazione. Dopo la chiamata, il buffer di destinazione contiene i dati dei vertici elaborati.

Il primo, il secondo e il terzo parametro, SrcStartIndex, DestIndex e VertexCount, riflettono l'indice del primo vertice da caricare, l'indice all'interno del buffer di destinazione in cui verranno posizionati i vertici e il numero totale di vertici da elaborare e posizionare rispettivamente nel buffer di destinazione. Il quarto parametro, pDestBuffer deve essere impostato sull'indirizzo dell'interfaccia IDirect3DVertexBuffer9 dell'oggetto buffer dei vertici che riceverà i vertici di origine. Il parametro SrcStartIndex specifica l'indice in corrispondenza del quale il metodo deve avviare l'elaborazione dei vertici.

Il parametro finale, Flags, determina opzioni di elaborazione speciali per il metodo. È possibile impostare questo parametro su 0 per l'elaborazione dei vertici predefinita o su D3DPV_DONOTCOPYDATA per ottimizzare l'elaborazione in alcune situazioni. È anche possibile combinare il valore D3DPV_DONOTCOPYDATA con uno o più valori D3DLOCK appropriati per il buffer di destinazione. Quando si imposta Flag su 0, i componenti dei vertici del vertex buffer di destinazione che non sono interessati dall'operazione di vertice vengono ancora copiati dal vertex shader o impostati su 0. Tuttavia, quando si usa D3DPV_DONOTCOPYDATA, IDirect3DDevice9::P rocessVertices non sovrascrive le informazioni sul colore e sulle coordinate della trama nel buffer di destinazione a meno che questi dati non vengano generati da Direct3D. Il colore diffuso viene generato quando l'illuminazione è abilitata, ovvero D3DRS_LIGHTING è impostata su TRUE. Il colore speculare viene generato quando l'illuminazione è abilitata e la speculare è abilitata, ovvero D3DRS_SPECULARENABLE e D3DRS_LIGHTING sono impostate su TRUE. Il colore speculare viene generato anche quando è abilitata la nebbia. Le coordinate della trama vengono generate quando la trasformazione della trama o la generazione di trame è abilitata. IDirect3DDevice9::P rocessVertices usa gli stati di rendering correnti per determinare l'elaborazione dei vertici da eseguire.

Impostazioni di utilizzo FVF per i vertex buffer di destinazione

Il metodo IDirect3DDevice9::P rocessVertices richiede impostazioni specifiche per D3DFVF del vertex buffer di destinazione. Le impostazioni di utilizzo FVF devono essere compatibili con le impostazioni correnti per l'elaborazione dei vertici.

Per l'elaborazione dei vertici della funzione fissa, IDirect3DDevice9::P rocessVertices richiede le impostazioni FVF seguenti:

  • Il tipo di posizione è sempre D3DFVF_XYZRHW ; pertanto, D3DFVF_XYZ e D3DFVF_XYZB1 tramite D3DFVF_XYZB5 non sono validi.
  • I flag D3DFVF_NORMAL, D3DFVF_RESERVED0 e D3DFVF_RESERVED2 non devono essere impostati.
  • Il flag D3DFVF_DIFFUSE deve essere impostato se un'operazione OR delle condizioni seguenti restituisce true:
    • L'illuminazione è abilitata; vale a dire, D3DRS_LIGHTING è TRUE.
    • L'illuminazione è disabilitata, il colore diffuso è presente nei flussi dei vertici di input e D3DPV_DONOTCOPYDATA non è impostato.
  • Il flag D3DFVF_SPECULAR deve essere impostato se un'operazione OR delle condizioni seguenti restituisce true:
    • L'illuminazione è abilitata e il colore speculare è abilitato; vale a dire, D3DRS_SPECULARENABLE è TRUE.
    • L'illuminazione è disabilitata, il colore speculare è presente nei flussi dei vertici di input e D3DPV_DONOTCOPYDATA non è impostato.
    • La nebbia dei vertici è abilitata; ovvero, D3DRS_FOGVERTEXMODE non è impostato su D3DFOG_NONE.

Inoltre, il conteggio delle coordinate della trama deve essere impostato nel modo seguente:

  • Se la trasformazione della trama e la generazione di trame sono disabilitate per tutte le fasi della trama attiva e la D3DPV_DONOTCOPYDATA non è impostata, il numero e il tipo di coordinate della trama di output devono corrispondere a quelli delle coordinate della trama dei vertici di input. Se D3DPV_DONOTCOPYDATA è impostato e la trasformazione della trama e la generazione di trame sono disabilitate, le coordinate della trama di output vengono ignorate.
  • Se la trasformazione della trama o la generazione di trame è abilitata per qualsiasi fase di trama attiva, il vertice di output potrebbe dover contenere più set di coordinate della trama rispetto al vertice di input. Ciò è dovuto alla proliferazione delle coordinate delle trame da quelle generate dalla generazione di trame o derivate dalle trasformazioni di trama. Si noti che si verifica una proliferazione simile delle coordinate della trama durante le chiamate IDirect3DDevice9::D rawPrimitive , ma non è visibile al programmatore dell'applicazione. In questo caso, Direct3D genera un nuovo set di coordinate della trama. Il nuovo set di coordinate della trama è derivato dall'esecuzione delle fasi della trama e dall'analisi delle impostazioni per la generazione di trame, la trasformazione della trama e l'indice delle coordinate della trama per determinare se per tale fase è necessario un set univoco di coordinate di trama. Ogni volta che è necessario un nuovo set, viene allocato in ordine crescente. Si noti che il requisito massimo e tipico è un set per fase, anche se potrebbe essere meno dovuto alla condivisione di coordinate di trama non trasformate tramite D3DTSS_TEXCOORDINDEX.

Pertanto, per ogni fase della trama, viene generato un nuovo set di coordinate di trama se una trama è associata a tale fase e una delle condizioni seguenti è vera:

  • La generazione di trame è abilitata per tale fase.
  • La trasformazione trama è abilitata per tale fase.
  • Le coordinate delle trame di input non transazionate vengono a cui viene fatto riferimento tramite D3DTSS_TEXCOORDINDEX per la prima volta.

Quando Direct3D genera coordinate di trama, l'applicazione deve eseguire le azioni seguenti:

  1. Usare un buffer dei vertici di destinazione con l'utilizzo FVF appropriato.
  2. Riprogrammare la D3DTSS_TEXCOORDINDEX della fase della trama in base alla posizione delle coordinate della trama post-elaborate. Si noti che la riprogrammazione dell'impostazione di D3DTSS_TEXCOORDINDEX si verifica quando il buffer dei vertici elaborati viene usato nelle successive chiamate IDirect3DDevice9::D rawPrimitive e IDirect3DDevice9::D rawIndexedPrimitive .

Infine, la dimensionalità delle coordinate delle trame (D3DFVF_TEX0 tramite D3DFVF_TEX8 ) deve essere impostata nel modo seguente:

  • Per ogni set di coordinate della trama, se la trasformazione della trama e la generazione di trame sono disabilitate, la dimensionalità delle coordinate della trama di output deve corrispondere all'input. Se la trasformazione della trama è abilitata, la dimensionalità di output deve corrispondere al conteggio definito dalle impostazioni di D3DTTFF_COUNT1, D3DTTFF_COUNT2, D3DTTFF_COUNT3 o D3DTTFF_COUNT4. Se la trasformazione della trama è disabilitata e la generazione di trame è abilitata, la dimensionalità di output deve corrispondere alle impostazioni per la modalità di generazione della trama; attualmente tutte le modalità generano tre valori float.

Quando IDirect3DDevice9::P rocessVertices ha esito negativo a causa di un codice FVF del vertex buffer di destinazione incompatibile, il codice previsto viene stampato nell'output di debug (solo compilazioni di debug).

Vertex Buffers