Condividi tramite


Conversione in Direct3D 9

Le funzionalità seguenti sono state modificate in Microsoft Direct3D 9. Se si usano queste funzionalità, vedere le modifiche elencate di seguito per facilitare la conversione dell'applicazione in Direct3D 9.

Modifiche di BaseVertexIndex

In DirectX 8.x IDirect3DDevice8::SetIndices richiedeva un puntatore al buffer di indice e un Oggetto BaseVertexIndex per la posizione iniziale nel vertex buffer. Prima di chiamare IDirect3DDevice8::D rawIndexedPrimitive, un'applicazione che esegue un batch di oggetti diversi nel buffer dei vertici deve cambiare il buffer di indice (o effettuare una chiamata a IDirect3DDevice8:::D rawIndexedPrimitive).

In Direct3D 9, la posizione iniziale nel vertex buffer , BaseVertexIndex, è stata spostata in IDirect3DDevice9::D rawIndexedPrimitive e il relativo tipo di dati è stato modificato da DWORD a inT.

HRESULT IDirect3DDevice9::DrawIndexedPrimitive( 
    D3DPRIMITIVETYPE PrimType, 
    INT BaseVertexIndex, 
    UINT minIndex, 
    UINT NumVertices, 
    UINT startIndex, 
    UINT primCount); 

HRESULT SetIndices(IDirect3DIndexBuffer9* pIndexData); 

Modifiche di CreateImageSurface

IDirect3DDevice8::CreateImageSurface è stato rinominato CreateOffscreenPlainSurface. È stato aggiunto un parametro aggiuntivo che accetta un tipo D3DPOOL. D3DPOOL_SCRATCH restituirà una superficie con caratteristiche identiche a una superficie creata da IDirect3DDevice8::CreateImageSurface. D3DPOOL_DEFAULT è il pool appropriato per l'uso con StretchRect e ColorFill.

modifiche D3DENUM_NO_WHQL_LEVEL

Le applicazioni devono ora richiedere esplicitamente Microsoft Windows Hardware Quality Labs (WHQL) perché la risposta richiede relativamente tempo (pochi secondi). D3DENUM_NO_WHQL_LEVEL è stato rimosso e D3DENUM_WHQL_LEVEL è stato aggiunto.

Creare modifiche alle risorse

Un handle è stato aggiunto a diversi metodi e deve essere impostato su NULL. I metodi interessati includono:

Modifiche di EnumAdapterModes

EnumAdapterModes accetta ora D3DFORMAT.

HRESULT IDirect3D9::EnumAdapterModes( 
       UINT Adapter, 
       D3DFORMAT Format, 
       UINT Mode, 
       D3DDISPLAYMODE *pMode); 

Il formato supporta un set espanso di modalità di visualizzazione. Per proteggere le applicazioni dall'enumerazione di formati che non sono stati inventati al momento della spedizione dell'applicazione, l'applicazione deve indicare a Direct3D il formato per le modalità di visualizzazione che devono essere enumerate. La matrice risultante di modalità di visualizzazione sarà diversa solo per larghezza, altezza e frequenza di aggiornamento.

L'applicazione specifica un formato pixel e l'enumerazione è limitata a quelle modalità di visualizzazione che corrispondono esattamente al formato. Di seguito è riportato un elenco dei formati consentiti:

  • D3DFMT_A1R5G5B5
  • D3DFMT_A2B10G10R10
  • D3DFMT_A8R8G8B8
  • D3DFMT_R5G6B5
  • D3DFMT_X1R5G5B5
  • D3DFMT_X8R8G8B8

L'enumerazione è equivalente per le versioni alfa e nonalpha dello stesso formato. Il formato restituito verrà sempre compilato con lo stesso formato fornito dall'applicazione.

Questo metodo considera 565 e 555 come equivalente e restituisce la versione corretta nel formato. La differenza entra in gioco solo quando l'applicazione blocca il buffer nascosto e c'è un flag esplicito che l'applicazione deve impostare per eseguire questa operazione.

Modifiche get/SetStreamSource

Un parametro è stato aggiunto ai metodi GetStreamSource e SetStreamSource . L'offset è il numero di byte tra l'inizio del flusso e l'inizio dei dati dei vertici. È misurata in byte. In questo modo la pipeline supporta gli offset del flusso. Per scoprire se il dispositivo supporta gli offset di flusso, vedere D3DDEVCAPS2_STREAMOFFSET.

HRESULT GetStreamSource(
    UINT StreamNumber,
    IDirect3DVertexBuffer9 **ppStreamData,
    UINT *pOffsetInBytes,
    UINT *pStride);

Modifiche di qualità multicampionamento

In precedenza era presente solo l'enumerazione D3DMULTISAMPLE_TYPE. Direct3D 9 mantiene questa enumerazione e aggiunge l'idea di un livello di qualità per ogni elemento dell'enumerazione. Il livello di qualità indica un compromesso tra qualità visiva e prestazioni indicando il numero di campioni mascherabili (nel senso di D3DRS_MULTISAMPLEMASK).

Un'applicazione deve scegliere il numero di esempi mascherabili richiesti e quindi consultare pQualityLevels. Se diverso da zero, questo valore indica il numero di livelli di qualità che l'applicazione può passare alle varie funzioni di creazione tramite MultiSampleQuality. Poiché i driver espongono tutti i relativi schemi multisample come livelli di qualità a D3DMULTISAMPLE_NONMASKABLE, è possibile enumerare tutti gli schemi multicampionamento disponibili tramite questo tipo se l'applicazione non deve mascherare i campioni.

Il bit di D3DPRASTERCAPS_STRETCHBLTMULTISAMPLE estremità è stato ritirato. Questo bit usava per indicare che il metodo di multicampionamento non supportava le maschere di scrittura e non poteva essere attivato e disattivato tra BeginScene e EndScene. Tali metodi non mascherabili vengono ora esposti tramite D3DMULTISAMPLE_NONMASKABLE.

HRESULT CheckDeviceMultiSampleType( 
       UINT Adapter, 
       D3DDEVTYPE DeviceType, 
       D3DFORMAT SurfaceFormat, 
       BOOL Windowed, 
       D3DMULTISAMPLE_TYPE MultiSampleType, 
       DWORD * pQualityLevels); 

Esiste un valore massimo diverso per ogni numero di campioni mascherabili. Ad esempio, D3DMULTISAMPLE_4_SAMPLES potrebbe avere tre livelli di qualità, mentre D3DMULTISAMPLE_2_SAMPLES potrebbe avere un solo livello. Ci sono al massimo otto livelli di qualità per ogni numero di campioni mascherabili (il driver non è autorizzato a esprimere di più). La qualità varia da zero a (*pQualityLevels - 1).

Modifiche di ResourceManagerDiscardBytes

ResourceManagerDiscardBytes è stato sostituito da IDirect3DDevice9::EvictManagedResources. Può rimuovere tutte le risorse, sia Direct3D che risorse driver.

Il gestore risorse viene ora consultato quando la creazione di una risorsa (gestita o non gestita) ha esito negativo perché la memoria video non è sufficiente. Al responsabile verrà chiesto automaticamente di liberare risorse sufficienti per la creazione. In DirectX 8.0 questo processo non è stato automatizzato.

Modifiche a SetSoftwareVertexProcessing

Un'applicazione può creare un dispositivo in modalità mista per usare l'elaborazione dei vertici software e hardware.

Per passare tra le due modalità di elaborazione dei vertici in DirectX 8.x, chiamare IDirect3DDevice8::SetRenderState. Questa operazione è stata sostituita con SetSoftwareVertexProcessing per semplificare i problemi causati dai blocchi di stato. Questo nuovo metodo non viene registrato dai blocchi di stato.

Modifiche del campionatore di trama

Direct3D 9 supporta fino a sedici superfici di trama in un passaggio usando il modello pixel shader 2_0; tuttavia, il numero di coordinate della trama rimane limitato a otto. Lo stato della fase della trama è associato a superfici, set di coordinate, elaborazione dei vertici e elaborazione pixel. Per gestire queste differenze in fase di compilazione, SetTextureStageState è stato suddiviso in due metodi:

  • IDirect3DDevice9::SetTextureStageState verrà comunque usato per lo stato delle coordinate della trama, ad esempio le modalità di wrapping e la generazione delle coordinate della trama.
  • SetSamplerState è stato aggiunto e verrà ora usato per filtrare, legare, bloccare, MIPLOD e così via. Questo funzionerà per un massimo di sedici campioni.

Modifiche di SetTextureStageState

IDirect3DDevice9::SetTextureStageState imposta ora gli stati seguenti:

  • Correzione dello stato di elaborazione dei vertici della funzione. Questo stato controlla la manipolazione delle coordinate della trama D3DTSS_TEXTURETRANSFORMFLAGS e D3DTSS_TEXCOORDINDEX. È possibile impostare fino a otto di ognuno di essi( perché sono sempre supportate otto coordinate della trama). D3DTSS_TEXCOORDINDEX è uno stato di elaborazione del vertice di funzione fissa. Se viene usato un vertex shader programmabile, questo stato viene ignorato.

  • Stato dello shader pixel della funzione fisso (textureStageState legacy).

    • D3DTSS_ALPHAARG0
    • D3DTSS_ALPHAARG1
    • D3DTSS_ALPHAARG2
    • D3DTSS_ALPHAOP
    • D3DTSS_BUMPENVLOFFSET
    • D3DTSS_BUMPENVLSCALE
    • D3DTSS_BUMPENVMAT00
    • D3DTSS_BUMPENVMAT01
    • D3DTSS_BUMPENVMAT10
    • D3DTSS_BUMPENVMAT11
    • D3DTSS_COLORARG0
    • D3DTSS_COLORARG1
    • D3DTSS_COLORARG2
    • D3DTSS_COLOROP
    • D3DTSS_RESULTARG

    Il numero di stati di pixel shader delle funzioni fisse che possono essere impostati è minore o uguale al numero rappresentato da MaxTextureBlendStages.

Il numero di campioni di trama disponibili per l'applicazione è determinato dalla versione pixel shader, come indicato nella tabella seguente.

Nome Number
ps_1_1 a ps_1_3 4 campioni di trama
ps_1_4 6 campioni di trama
ps_2_0 16 campioni di trama
pipeline di funzione fissa Esempi di trama MaxTextureBlendStages/MaxSimultaneousTextures

 

I dispositivi che supportano il mapping di spostamento in Direct3D 9 supportano un sampler aggiuntivo (D3DDMAPSAMPLER), che campioni le mappe di spostamento nell'unità tessellatore.

Modifiche setSamplerState

IDirect3DDevice9::SetSamplerState imposta lo stato del sampler (incluso quello usato nell'unità tessellatore per eseguire mappe di spostamento di esempio). Sono stati rinominati con un prefisso D3DSAMP_ per abilitare il rilevamento degli errori in fase di compilazione durante la conversione da DirectX 8.x. Gli stati includono:

  • D3DSAMP_ADDRESSU
  • D3DSAMP_ADDRESSV
  • D3DSAMP_ADDRESSW
  • D3DSAMP_BORDERCOLOR
  • D3DSAMP_MAGFILTER
  • D3DSAMP_MAXANISOTROPY
  • D3DSAMP_MAXMIPLEVEL
  • D3DSAMP_MINFILTER
  • D3DSAMP_MIPFILTER
  • D3DSAMP_MIPMAPLODBIAS

Modifiche alla dichiarazione vertex

Le dichiarazioni vertex sono ora disaccoppiate dalla creazione del vertex shader. Le dichiarazioni vertex usano ora un'interfaccia COM (Component Object Model).

Per DirectX 8.x, le dichiarazioni di vertice sono associate ai vertex shader.

  • Per la pipeline della funzione fissa, chiamare SetVertexShader con il codice FVF (Flexible Vertex Format) del buffer del vertice.
  • Per i vertex shader, chiamare IDirect3DDevice9::SetVertexShader con un handle a un vertex shader creato in precedenza. Lo shader include una dichiarazione di vertice.

Per Direct3D 9, le dichiarazioni di vertice vengono decoupate dai vertex shader e possono essere usate con la pipeline di funzioni fissa o con shader.

  • Per la pipeline della funzione fissa, non è necessario chiamare IDirect3DDevice9::SetVertexShader. Se, tuttavia, si vuole passare alla pipeline di funzione fissa e aver usato in precedenza un vertex shader, chiamare IDirect3DDevice9::SetVertexShader(NULL). Al termine, sarà comunque necessario chiamare SetFVF per dichiarare il codice FVF.
  • Quando si usano i vertex shader, chiamare IDirect3DDevice9::SetVertexShader con l'oggetto vertex shader. Chiamare inoltre IDirect3DDevice9::SetFVF per configurare una dichiarazione di vertice. In questo modo vengono usate le informazioni implicite nell'FVF. SetVertexDeclaration può essere chiamato al posto di IDirect3DDevice9::SetFVF perché supporta dichiarazioni di vertice che non possono essere espresse con un FVF.

Intervalli e modifiche di SwapEffects

Sono state apportate diverse modifiche per fornire all'utente un maggiore controllo sulla frequenza di aggiornamento, sulla frequenza di presentazione e sul buffer front-buffer rispetto al disegno back-buffer. Ecco quali sono:

  • Rimosso un effetto di scambio, D3DSWAPEFFECT_COPY_VSYNC e una frequenza di presentazione, D3DPRESENT_RATE_UNLIMITED.
  • Rinominato D3DPRESENT_PARAMETERS. FullScreen_PresentationInterval a PresentationIntervals.
  • Aggiunta D3DPRESENT_INTERVAL_IMMEDIATE, il che significa che la presentazione non è sincronizzata con la sincronizzazione verticale. Come in DirectX 8.x, D3DPRESENT_INTERVAL_DEFAULT è definito come zero ed è equivalente a D3DPRESENT_INTERVAL_ONE. D3DPRESENT_INTERVAL_DEFAULT è una comodità per inizializzare D3DPRESENT_PARAMETERS a zero.

Per una spiegazione dettagliata delle modalità e degli intervalli supportati, vedere D3DPRESENT.

Grafica Direct3D 9