Condividi tramite


Elaborazione vertice a 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 a 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à dei 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, 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 del IDirect3DVertexBuffer9'interfaccia dell'oggetto vertex buffer 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 le 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 vertex vengono comunque 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 è abilitata la trasformazione della trama o la generazione di trame. IDirect3DDevice9::P rocessVertices usa gli stati di rendering correnti per determinare l'elaborazione dei vertici da eseguire.

Impostazioni di utilizzo FVF per i buffer dei vertici di destinazione

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

Per l'elaborazione dei vertici a 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; ovvero 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; ovvero 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 di trama attive 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 della 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 di trama da quelle generate dalla generazione di trame o derivate dalle trasformazioni di trama. Si noti che una proliferazione simile di coordinate di trama si verifica durante IDirect3DDevice9::D rawPrimitive chiamate, ma non è visibile al programmatore dell'applicazione. In questo caso, Direct3D genera un nuovo set di coordinate di 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 viene richiesto un nuovo set, viene allocato in ordine crescente. Si noti che il requisito massimo e tipico è un set per fase, anche se potrebbe essere minore a causa della 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 convertite 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 vertex buffer di destinazione con l'utilizzo FVF appropriato.
  2. Riprogrammare il D3DTSS_TEXCOORDINDEX della fase della trama in base alla posizione delle coordinate delle trame post-elaborate. Si noti che la riprogrammazione dell'impostazione di D3DTSS_TEXCOORDINDEX si verifica quando il buffer dei vertici elaborato viene usato nelle successive chiamate IDirect3DDevice9::D rawPrimitive e IDirect3DDevice9::D rawIndexedPrimitive.

Infine, la dimensionalità delle coordinate della trama (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 della trama sono disabilitate, la dimensionalità della coordinata della trama di output deve corrispondere all'input. Se la trasformazione 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 trama è disabilitata e la generazione di trame è abilitata, la dimensionalità dell'output deve corrispondere alle impostazioni per la modalità di generazione della trama; attualmente tutte le modalità generano tre valori float.

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

vertex buffer