Condividi tramite


Considerazioni da Direct3D 9 a Direct3D 10 (Direct3D 10)

La pagina seguente fornisce una struttura di base delle differenze principali tra Direct3D 9 e Direct3D 10. La struttura seguente fornisce alcune informazioni dettagliate per aiutare gli sviluppatori con l'esperienza Direct3D 9 per esplorare e correlare a Direct3D 10.

Anche se le informazioni in questo argomento confrontano Direct3D 9 con Direct3D 10, perché Direct3D 11 si basa sui miglioramenti apportati in Direct3D 10 e 10.1, sono necessarie anche queste informazioni per eseguire la migrazione da Direct3D 9 a Direct3D 11. Per informazioni sul passaggio da Direct3D 10 a Direct3D 11, vedi Migrazione a Direct3D 11.

Panoramica dei principali cambiamenti strutturali in Direct3D 10

Il processo di rendering con il dispositivo Direct3D 10 è strutturalmente simile a Direct3D 9.

  • Impostare un'origine del flusso di vertici
  • Impostare il layout di input in Direct3D 10 (impostare la dichiarazione del flusso di vertici in Direct3D 9)
  • Dichiarare la topologia primitiva
  • Impostare trame
  • Impostare gli oggetti di stato
  • Impostare shader
  • Draw

La chiamata Draw collega le operazioni. L'ordinamento delle chiamate prima della chiamata Draw è arbitrario. Le principali differenze nella progettazione api Direct3D 10 sono le seguenti:

  • Rimozione della funzione fissa
  • Rimozione dei bit CAPS : è garantito il set di funzionalità di base di Direct3D 10
  • Gestione più restrittiva di: accesso alle risorse, stato del dispositivo, costanti shader, collegamento dello shader (input e output agli shader) tra le fasi
  • Le modifiche al nome del punto di ingresso dell'API riflettono l'uso della memoria GPU virtuale (Map() invece di Lock()).
  • È possibile aggiungere un livello di debug al dispositivo in fase di creazione
  • La topologia primitiva è ora uno stato esplicito (separato dalla chiamata Draw)
  • Le costanti shader esplicite vengono ora archiviate in buffer costanti
  • La creazione di shader viene eseguita interamente in HLSL. Il compilatore HLSL ora si trova nella DLL direct3D 10 primaria.
  • Nuova fase programmabile: il geometry shader
  • Rimozione di BeginScene()/EndScene()
  • Funzionalità comuni di gestione degli adattatori e dello stato attivo 2D implementate in un nuovo componente: DXGI

Rimozione della funzione fissa

A volte è sorprendente che anche in un motore Direct3D 9 che sfrutta completamente la pipeline programmabile, rimane una serie di aree che dipendono dalla pipeline a funzione fissa (FF). Le aree più comuni sono in genere correlate al rendering allineato allo spazio dello schermo per l'interfaccia utente. Per questo motivo è probabile che sia necessario creare uno shader di emulazione FF o un set di shader che forniscono i comportamenti di sostituzione necessari.

Questa documentazione contiene un white paper contenente origini shader sostitutive per i comportamenti FF più comuni (vedere Esempio di EMU di funzioni fisse). Alcuni comportamenti pixel a funzione fissa, incluso il test alfa, sono stati spostati in shader.

Convalida dell'ora di creazione dell'oggetto dispositivo

La pipeline Direct3D 10 è stata riprogettata da zero in hardware e software con l'intenzione principale di ridurre il sovraccarico della CPU (in fase di disegno). Per ridurre i costi, a tutti i tipi di dati del dispositivo è stato assegnato un oggetto con metodi di creazione espliciti forniti dal dispositivo stesso. Ciò consente una convalida rigorosa dei dati in fase di creazione dell'oggetto anziché durante la chiamata Draw, come spesso avviene con Direct3D 9.

Astrazioni/separazione del motore

Le applicazioni, inclusi i giochi, che desiderano supportare sia Direct3D 9 che Direct3D 10 devono avere i livelli di rendering astratti dal resto della codebase. Esistono molti modi per ottenere questo risultato, ma la chiave per tutti è la progettazione del livello di astrazione per il dispositivo Direct3D di livello inferiore. Tutti i sistemi devono comunicare con l'hardware tramite il livello comune progettato per fornire risorse GPU e gestione dei tipi di basso livello.

Rimozione diretta delle dipendenze direct3D 9

Quando si esegue la conversione di codebase di grandi dimensioni, precedentemente testate, è importante ridurre al minimo la quantità di modifiche di codice a quelle assolutamente necessarie per mantenere i comportamenti testati in precedenza nel codice. Le procedure consigliate includono la documentazione chiara in cui gli elementi cambiano usando i commenti. Spesso è utile avere uno standard di commento per questo lavoro che consente di spostarsi rapidamente attraverso la codebase.

Di seguito è riportato un elenco di esempi di commenti a riga singola/blocco iniziale standard che possono essere usati per questo lavoro.

Articolo Descrizione
Direct3D 10 RIMOSSO
Usare questa opzione in cui vengono rimosse righe/blocchi di codice
AGGIORNAMENTO DELLE ESIGENZE DI Direct3D 10
Consente di aggiungere note aggiuntive al commento NEED UPDATE che suggerisce il lavoro o la nuova API da usare per le visite successive al codice per la conversione del comportamento. È inoltre consigliabile usare un uso elevato di assert(false) in cui si verifica \\ Direct3D 10 NEEDS UPDATE per assicurarsi di non eseguire inconsapevolmente il codice errant
Direct3D 10 MODIFICATO
Le aree in cui si sono verificate modifiche importanti devono essere mantenute per riferimento futuro, ma commentate
// Direct3D 10 END
Qualificatore del blocco di codice finale

 

Per più righe di origine è consigliabile usare anche i commenti /* */ di stile C, ma aggiungere i commenti di inizio/fine pertinenti in queste aree.

Trucchi per la risoluzione rapida dei problemi di compilazione delle applicazioni

Override dei tipi Direct3D 9

Può essere utile inserire un file di intestazione di alto livello contenente definizioni di tipi/override per i tipi di base Direct3D 9 che non sono più supportati dalle intestazioni Direct3D 10. Ciò consente di ridurre al minimo la quantità di modifiche nel codice e nelle interfacce in cui è presente un mapping diretto da un tipo Direct3D 9 al tipo Direct3D 10 appena definito. Questo approccio è utile anche per mantenere insieme i comportamenti del codice in un unico file di origine. In questo caso, è consigliabile definire tipi indipendenti dalla versione o in genere denominati che descrivono costrutti comuni usati per il rendering, ma si estendono sia sulle API Direct3D 9 che su Direct3D 10. Ad esempio:

#if defined(D3D9)
typedef IDirect3DIndexBuffer9   IDirect3DIndexBuffer;
typedef IDirect3DVertexBuffer9  IDirect3DVertexBuffer;
#else //D3D10
typedef ID3D10Buffer            IDirect3DIndexBuffer;
typedef ID3D10Buffer            IDirect3DVertexBuffer
#endif

Altri esempi specifici di Direct3D 10 includono:

typedef ID3D10TextureCube   IDirect3DCubeTexture;
typedef ID3D10Texture3D     IDirect3DVolumeTexture;
typedef D3D10_VIEWPORT      D3DVIEWPORT;
typedef ID3D10VertexShader  IDirect3DVertexShader;
typedef ID3D10PixelShader   IDirect3DPixelShader;

È consigliabile sviluppare applicazioni Direct3D 10 e Windows Vista usando la versione più recente di Microsoft Visual Studio. Tuttavia, è possibile compilare un'applicazione Windows Vista che dipende da Direct3D 10 usando la versione precedente 2003 di Visual Studio. Direct3D 10 è un componente della piattaforma Windows Vista con dipendenze (come con l'SDK della piattaforma Server 2003 SP1) nella libreria seguente: BufferOverflowU.lib è necessario per risolvere eventuali problemi del linker di controllo buffer_security.

Simulazione di CAP del dispositivo

Molte applicazioni contengono aree di codice che dipendono dai dati CAPS del dispositivo disponibili. Risolvere questo problema eseguendo l'override dell'enumerazione del dispositivo e forzando i CAPS del dispositivo a valori sensibili. Pianificare nuovamente le aree in cui sono presenti dipendenze dai CAPS in un secondo momento per la rimozione completa dei CAPS, laddove possibile.

Guida all'API Direct3D 10

Questa sezione è incentrata sulle modifiche del comportamento causate dall'API Direct3D 10.

Creazione di risorse

L'API Direct3D 10 ha progettato le risorse come tipi di buffer generici con flag di associazione specifici in base all'utilizzo pianificato. Questo punto di progettazione è stato scelto per facilitare l'accesso quasi universale delle risorse nella pipeline per scenari come il rendering in un buffer dei vertici, quindi disegnare immediatamente i risultati senza interrompere la CPU. L'esempio seguente illustra l'allocazione di vertex buffer e buffer di indice in cui è possibile notare che la descrizione della risorsa è diversa solo dai flag di associazione di risorse GPU.

L'API Direct3D 10 ha fornito metodi helper trama per creare in modo esplicito le risorse del tipo di trama, ma come si può immaginare, queste sono davvero funzioni helper.

  • CreateTexture2D()
  • CreateTextureCube()
  • CreateTexture3D()

Quando la destinazione è Direct3D 10, è probabile che si voglia allocare più elementi durante il tempo di creazione delle risorse rispetto a quello usato con Direct3D 9. Questo diventerà più evidente con la creazione di buffer di destinazione di rendering e trame in cui è necessario creare anche una visualizzazione per accedere al buffer e impostare la risorsa nel dispositivo.

Esercitazione 1: Nozioni di base su Direct3D 10

Nota

Direct3D 10 e versioni successive di Direct3D estendono il formato di file DDS per supportare nuovi formati DXGI, matrici di trame e matrici mappa cubo. Per altre informazioni sull'estensione del formato di file DDS, vedere la Guida alla programmazione per DDS.

 

Visualizzazioni

Una visualizzazione è un'interfaccia tipizzata specificamente per i dati archiviati in un buffer di pixel. Una risorsa può avere diverse visualizzazioni allocate contemporaneamente e questa funzionalità è evidenziata nell'esempio Single Pass Render to Cubemap contenuto in questo SDK.

Pagina Guida per programmatori in Accesso alle risorse

Esempio di CubeMap

Accesso a risorse statiche e dinamiche

Per ottenere prestazioni ottimali, le applicazioni devono partizionare l'uso dei dati in termini di natura statica e dinamica dei dati. Direct3D 10 è stato progettato per sfruttare questo approccio e, di conseguenza, le regole di accesso per le risorse sono state notevolmente rafforzate rispetto a Direct3D 9. Per le risorse statiche è consigliabile popolare la risorsa con i relativi dati durante la creazione. Se il motore è stato progettato per creare, bloccare, riempire, sbloccare il punto di progettazione direct3D 9, è possibile rinviare il popolamento in fase di creazione usando una risorsa di staging e il metodo UpdateSubResource nell'interfaccia della risorsa.

Effetti direct3D 10

L'uso del sistema Direct3D 10 Effects non rientra nell'ambito di questo articolo. Il sistema è stato scritto per sfruttare appieno i vantaggi dell'architettura offerti da Direct3D 10. Per altri dettagli sull'uso, vedi la sezione Effetti (Direct3D 10 ).

HLSL senza effetti

La pipeline direct3D 10 shader può essere guidata senza l'uso del sistema Direct3D 10 Effects. Si noti che in questa istanza, tutti i buffer costanti, gli shader, il campionatore e l'associazione di trame devono essere gestiti dall'applicazione stessa. Per altre informazioni, vedere il collegamento di esempio e le sezioni seguenti di questo documento:

Esempio di HLSL senza effetti

Compilazione shader

Il compilatore Direct3D 10 HLSL offre miglioramenti alla definizione del linguaggio HLSL e quindi ha la possibilità di operare in 2 modalità. Per il supporto completo delle funzioni intrinseche e della semantica dello stile Direct3D 9, la compilazione deve essere richiamata usando il flag COMPATIBILITY MODE che può essere specificato in base alla compilazione.

Il modello di shader 4.0 specifico semantica del linguaggio HLSL e funzioni intrinseche per Direct3D 10 è disponibile in HLSL. Modifiche principali nella sintassi da Direct3D 9 HLSL per prendere la maggior parte degli avvisi sono nell'area di accesso alle trame. La nuova sintassi è l'unica forma supportata dal compilatore al di fuori della modalità di compatibilità.

Nota

Le API di tipo compilatore Direct3D 10 (D3D10CompileShader e D3D10CompileEffectFromMemory) vengono fornite dai runtime Direct3D 10, 10.1 e 11 eseguiti in Windows Vista e versioni successive. Le API di tipo compilatore Direct3D 10 hanno la stessa funzionalità del compilatore HLSL fornito in DirectX SDK (dicembre 2006). Questo compilatore HLSL non supporta i profili Direct3D 10.1 (vs_4_1, ps_4_1, gs_4_1, fx_4_1) e manca una serie di ottimizzazioni e miglioramenti. È possibile ottenere un compilatore HLSL che supporta i profili Direct3D 10.1 dalla versione legacy di DirectX SDK più recente. Per informazioni sull'SDK DirectX legacy, vedere Dove si trova DirectX SDK?. È possibile ottenere la versione più recente di HLSL Fxc.exe compilatore da riga di comando e API D3DCompiler da Windows SDK.

 

Creazione di risorse shader

La creazione di istanze di shader compilate al di fuori del sistema Direct3D 10 Effects viene eseguita in modo molto simile a Direct3D 9, tuttavia, in Direct3D 10, è importante mantenere la firma di input dello shader per un uso successivo. La firma viene restituita per impostazione predefinita come parte del BLOB dello shader, ma può essere estratta per ridurre i requisiti di memoria, se necessario. Per altri dettagli, vedere Uso degli shader in Direct3D 10.

Interfaccia del livello reflection shader

Il livello di reflection dello shader è l'interfaccia in base alla quale è possibile ottenere informazioni sui requisiti dello shader. Ciò è particolarmente utile quando si creano collegamenti all'assembly di input (vedere di seguito) in cui potrebbe essere necessario attraversare i requisiti di input dello shader per assicurarsi di fornire la struttura di input corretta allo shader. È possibile creare un'istanza dell'interfaccia del livello di reflection contemporaneamente alla creazione di un'istanza di uno shader compilato.

Il livello di reflection dello shader sostituisce i metodi D3DX9 che forniscono funzionalità simili. Ad esempio, IsParameterUsed viene sostituito dal metodo GetDesc.

Layout dell'assembler di input - Vertex Shader/Input Stream Linkage

Input Assembler (IA) sostituisce la dichiarazione di flusso dei vertici in stile Direct3D 9 e la struttura della descrizione è molto simile in forma. La differenza principale che l'IA porta è che l'oggetto layout IA creato deve eseguire direttamente il mapping a un formato specifico di firma di input dello shader. L'oggetto di mapping creato per collegare il flusso di input allo shader può essere usato in un numero qualsiasi di shader in cui la firma di input dello shader corrisponde a quella dello shader usato per creare il layout di input.

Per guidare al meglio la pipeline con dati statici, è consigliabile prendere in considerazione le permutazioni del formato del flusso di input per possibili firme di input dello shader e creare le istanze dell'oggetto di layout IA il prima possibile e riutilizzarle laddove possibile.

Impatto della rimozione del codice non recapitabili dello shader

La sezione seguente descrive in dettaglio una differenza significativa tra Direct3D 9 e Direct3D 10 che probabilmente richiede un'attenta gestione nel codice del motore. Gli shader che contengono espressioni condizionali spesso hanno alcuni percorsi di codice rimossi come parte del processo di compilazione. In Direct3D 9, è possibile rimuovere due tipi di input (contrassegnati per la rimozione) quando non usati: input di firma (come l'esempio seguente) e input costanti. Se la fine del buffer costante contiene voci inutilizzate, la dichiarazione di dimensione nello shader rifletterà le dimensioni del buffer costante senza le voci inutilizzate alla fine. Entrambi questi tipi di input rimangono nelle firme o nei buffer costanti Direct3D 10 con un'eccezione speciale nel caso di input costanti inutilizzate alla fine di un buffer costante. Ciò può avere un impatto sul motore quando si gestiscono shader di grandi dimensioni e si creano layout di input. Gli elementi rimossi dalle ottimizzazioni del codice non recapitabili nel compilatore devono comunque essere dichiarati nella struttura di input. Questo concetto è illustrato nell'esempio seguente:

Esempio di struttura di input vertex shader

struct VS_INPUT
{
float4 pos: SV_Position;
float2 uv1 : Texcoord1;
float2 uv2 : Texcoord2; *
};

* Rimozione del codice morto Direct3D 9 rimuoverebbe la dichiarazione nello shader a causa della rimozione condizionale del codice non risolto

float4x4  g_WorldViewProjMtx;
static const bool g_bLightMapped = false; // define a compile time constant

VS_INPUT main(VS_INPUT i) 
{
    VS_INPUT o;
    o.pos = mul( i.pos, g_WorldViewProjMtx);
    o.uv1 = i.uv1;
    if ( g_bLightMapped )
    {
        o.uv2 = i.uv2;
    }
    return o;
}

In alternativa, è possibile rendere ancora più evidente che la costante è una costante in fase di compilazione con la dichiarazione seguente:

#define LIGHT_MAPPED false

Nell'esempio precedente, in Direct3D 9, l'elemento uv2 verrà rimosso a causa di ottimizzazioni del codice non recapitabili nel compilatore. In Direct3D 10 il codice non recapitabile verrà comunque rimosso, ma il layout dell'assembler di input dello shader richiede che esista la definizione dei dati di input. Il livello di reflection dello shader fornisce i mezzi per gestire questa situazione in modo generico in cui è possibile attraversare i requisiti di input dello shader e assicurarsi di fornire una descrizione completa del mapping della firma del flusso di input allo shader.

Ecco una funzione di esempio per rilevare l'esistenza di un nome/indice semantico in una firma di funzione:

// Returns true if the SemanticName / SemanticIndex is used in the input signature.
// pReflector is a previously acquired shader reflection interface.
bool IsSignatureElementExpected(ID3D10ShaderReflection *pReflector, const LPCSTR SemanticName, UINT SemanticIndex)
{
    D3D10_SHADER_DESC               shaderDesc;
    D3D10_SIGNATURE_PARAMETER_DESC  paramDesc;

    Assert(pReflector);
    Assert(SemanticName);

    pReflector->GetDesc(&shaderDesc);

    for (UINT k=0; k<shaderDesc.InputParameters; k++)
    {
        pReflector->GetInputParameterDesc( k, &paramDesc);
        if (wcscmp( SemanticName, paramDesc.SemanticName)==0 && paramDesc.SemanticIndex == SemanticIndex) 
            return true;
    }

    return false;
}

Creazione di oggetti di stato

Quando si esegue la conversione del codice del motore, può essere utile usare inizialmente un set predefinito di oggetti di stato e disabilitare tutte le impostazioni di stato/stato di rendering del dispositivo Direct3D 9. Ciò causerà il rendering degli artefatti, ma è il modo più rapido per rendere operativi le operazioni. In un secondo momento è possibile costruire un sistema di gestione degli oggetti di stato che può usare una chiave composta per consentire il riutilizzo massimo del numero massimo di oggetti di stato in uso.

Conversione di trame

Formati di file supportati

Le funzioni D3DXxxCreateXXX e D3DXxxSaveXXX che creano o salvano una trama da o in un file grafico (ad esempio, D3DX10CreateTextureFromFile) supportano un set diverso di formati di file in Direct3D 10 rispetto a quanto fatto in Direct3D 9:

Formato file Direct3D 9 Direct3D 10
.bmp yes yes
JPG yes yes
.tga yes
.png yes yes
.dds yes yes
.Ppm yes
.dib yes
.Hdr yes
Pfm yes
TIFF yes
.gif yes
.tif yes

 

Per informazioni dettagliate, confrontare le enumerazioni direct3D 9 D3DXIMAGE_FILEFORMAT con le enumerazioni D3DX10_IMAGE_FILE_FORMAT per Direct3D 10.

Nota

La libreria di utilità D3DX (D3DX 9, D3DX 10 e D3DX 11) è deprecata per Windows 8. Per l'elaborazione di file di trama, è consigliabile usare DirectXTex.

 

Mapping dei formati di trama

La tabella seguente illustra il mapping dei formati di trama da Direct3D 9 a Direct3D 10. Qualsiasi contenuto in formati non disponibili in DXGI dovrà essere convertito dalle routine di utilità.

Formato Direct3D 9 Formato Direct3D 10
D3DFMT_UNKNOWN DXGI_FORMAT_UNKNOWN
D3DFMT_R8G8B8 Non disponibile
D3DFMT_A8R8G8B8 DXGI_FORMAT_B8G8R8A8_UNORM & DXGI_FORMAT_B8G8R8A8_UNORM_SRGB¹
D3DFMT_X8R8G8B8 DXGI_FORMAT_B8G8R8X8_UNORM & DXGI_FORMAT_B8G8R8X8_UNORM_SRGB¹
D3DFMT_R5G6B5 DXGI_FORMAT_B5G6R5_UNORM²
D3DFMT_X1R5G5B5 Non disponibile
D3DFMT_A1R5G5B5 DXGI_FORMAT_B5G5R5A1_UNORM²
D3DFMT_A4R4G4B4 DXGI_FORMAT_B4G4R4A4_UNORM
D3DFMT_R3G3B2 Non disponibile
D3DFMT_A8 DXGI_FORMAT_A8_UNORM
D3DFMT_A8R3G3B2 Non disponibile
D3DFMT_X4R4G4B4 Non disponibile
D3DFMT_A2B10G10R10 DXGI_FORMAT_R10G10B10A2
D3DFMT_A8B8G8R8 DXGI_FORMAT_R8G8B8A8_UNORM e DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
D3DFMT_X8B8G8R8 Non disponibile
D3DFMT_G16R16 DXGI_FORMAT_R16G16_UNORM
D3DFMT_A2R10G10B10 Non disponibile
D3DFMT_A16B16G16R16 DXGI_FORMAT_R16G16B16A16_UNORM
D3DFMT_A8P8 Non disponibile
D3DFMT_P8 Non disponibile
D3DFMT_L8 DXGI_FORMAT_R8_UNORM Nota: usare .r swizzle nello shader per duplicare il rosso in altri componenti per ottenere il comportamento D3D9.
D3DFMT_A8L8 DXGI_FORMAT_R8G8_UNORM Nota: usare swizzle .rrrg nello shader per duplicare il rosso e spostare il verde nei componenti alfa per ottenere il comportamento D3D9.
D3DFMT_A4L4 Non disponibile
D3DFMT_V8U8 DXGI_FORMAT_R8G8_SNORM
D3DFMT_L6V5U5 Non disponibile
D3DFMT_X8L8V8U8 Non disponibile
D3DFMT_Q8W8V8U8 DXGI_FORMAT_R8G8B8A8_SNORM
D3DFMT_V16U16 DXGI_FORMAT_R16G16_SNORM
D3DFMT_W11V11U10 Non disponibile
D3DFMT_A2W10V10U10 Non disponibile
D3DFMT_UYVY Non disponibile
D3DFMT_R8G8_B8G8 DXGI_FORMAT_G8R8_G8B8_UNORM (in DX9 i dati sono stati ridimensionati di 255,0f, ma questo può essere gestito nel codice shader).
D3DFMT_YUY2 Non disponibile
D3DFMT_G8R8_G8B8 DXGI_FORMAT_R8G8_B8G8_UNORM (in DX9 i dati sono stati ridimensionati di 255,0f, ma questo può essere gestito nel codice shader).
D3DFMT_DXT1 DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB
D3DFMT_DXT2 DXGI_FORMAT_BC1_UNORM & DXGI_FORMAT_BC1_UNORM_SRGB Nota: DXT1 e DXT2 sono uguali dal punto di vista dell'API/hardware... solo la differenza è "alfa premoltiplicata", che può essere rilevata da un'applicazione e non richiede un formato separato.
D3DFMT_DXT3 DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB
D3DFMT_DXT4 DXGI_FORMAT_BC2_UNORM & DXGI_FORMAT_BC2_UNORM_SRGB Nota: DXT3 e DXT4 sono uguali dal punto di vista dell'API/hardware... solo la differenza è "alfa premoltiplicata", che può essere rilevata da un'applicazione e non richiede un formato separato.
D3DFMT_DXT5 DXGI_FORMAT_BC3_UNORM & DXGI_FORMAT_BC3_UNORM_SRGB
D3DFMT_D16 & D3DFMT_D16_LOCKABLE DXGI_FORMAT_D16_UNORM
D3DFMT_D32 Non disponibile
D3DFMT_D15S1 Non disponibile
D3DFMT_D24S8 Non disponibile
D3DFMT_D24X8 Non disponibile
D3DFMT_D24X4S4 Non disponibile
D3DFMT_D16 DXGI_FORMAT_D16_UNORM
D3DFMT_D32F_LOCKABLE DXGI_FORMAT_D32_FLOAT
D3DFMT_D24FS8 Non disponibile
D3DFMT_S1D15 Non disponibile
D3DFMT_S8D24 DXGI_FORMAT_D24_UNORM_S8_UINT
D3DFMT_X8D24 Non disponibile
D3DFMT_X4S4D24 Non disponibile
D3DFMT_L16 DXGI_FORMAT_R16_UNORM Nota: usare .r swizzle nello shader per duplicare il rosso in altri componenti per ottenere il comportamento D3D9.
D3DFMT_INDEX16 DXGI_FORMAT_R16_UINT
D3DFMT_INDEX32 DXGI_FORMAT_R32_UINT
D3DFMT_Q16W16V16U16 DXGI_FORMAT_R16G16B16A16_SNORM
D3DFMT_MULTI2_ARGB8 Non disponibile
D3DFMT_R16F DXGI_FORMAT_R16_FLOAT
D3DFMT_G16R16F DXGI_FORMAT_R16G16_FLOAT
D3DFMT_A16B16G16R16F DXGI_FORMAT_R16G16B16A16_FLOAT
D3DFMT_R32F DXGI_FORMAT_R32_FLOAT
D3DFMT_G32R32F DXGI_FORMAT_R32G32_FLOAT
D3DFMT_A32B32G32R32F DXGI_FORMAT_R32G32B32A32_FLOAT
D3DFMT_CxV8U8 Non disponibile
D3DDECLTYPE_FLOAT1 DXGI_FORMAT_R32_FLOAT
D3DDECLTYPE_FLOAT2 DXGI_FORMAT_R32G32_FLOAT
D3DDECLTYPE_FLOAT3 DXGI_FORMAT_R32G32B32_FLOAT
D3DDECLTYPE_FLOAT4 DXGI_FORMAT_R32G32B32A32_FLOAT
D3DDECLTYPED3DCOLOR Non disponibile
D3DDECLTYPE_UBYTE4 DXGI_FORMAT_R8G8B8A8_UINT Nota: shader ottiene valori UINT, ma se sono necessari float integrali di stile Direct3D 9 (0,0f, 1,0f... 255.f), UINT può essere convertito in float32 in shader.
D3DDECLTYPE_SHORT2 DXGI_FORMAT_R16G16_SINT Nota: shader ottiene valori SINT, ma se sono necessari float integrali di stile Direct3D 9, SINT può essere semplicemente convertito in float32 in shader.
D3DDECLTYPE_SHORT4 DXGI_FORMAT_R16G16B16A16_SINT Nota: shader ottiene valori SINT, ma se sono necessari float integrali di stile Direct3D 9, SINT può essere semplicemente convertito in float32 nello shader.
D3DDECLTYPE_UBYTE4N DXGI_FORMAT_R8G8B8A8_UNORM
D3DDECLTYPE_SHORT2N DXGI_FORMAT_R16G16_SNORM
D3DDECLTYPE_SHORT4N DXGI_FORMAT_R16G16B16A16_SNORM
D3DDECLTYPE_USHORT2N DXGI_FORMAT_R16G16_UNORM
D3DDECLTYPE_USHORT4N DXGI_FORMAT_R16G16B16A16_UNORM
D3DDECLTYPE_UDEC3 Non disponibile
D3DDECLTYPE_DEC3N Non disponibile
D3DDECLTYPE_FLOAT16_2 DXGI_FORMAT_R16G16_FLOAT
D3DDECLTYPE_FLOAT16_4 DXGI_FORMAT_R16G16B16A16_FLOAT
FourCC 'ATI1' DXGI_FORMAT_BC4_UNORM
FourCC 'ATI2' DXGI_FORMAT_BC5_UNORM

 

¹DXGI 1.1, incluso nel runtime Direct3D 11, include formati BGRA. Tuttavia, il supporto per questi formati è facoltativo per i dispositivi Direct3D 10 e 10.1 con driver implementati per Windows Display Driver Model (WDDM) per Windows Vista (WDDM 1.0). È consigliabile usare invece DXGI_FORMAT_R8G8B8A8_UNORM. In alternativa, è possibile creare il dispositivo con D3D10_CREATE_DEVICE_BGRA_SUPPORT per assicurarsi di supportare solo i computer con il runtime Direct3D 11.0 e un driver WDDM 1.1 o versione successiva.

²DXGI 1.0 ha definito formati 5:6:5 e 5:5:5:1, ma non supportati dal runtime Direct3D 10.x o Direct3D 11.0. Questi formati sono facoltativamente supportati con DXGI 1.2 nel runtime di DirectX 11.1, obbligatorio per le schede video di livello 11.1 e WDDM 1.2 (modello di driver di visualizzazione a partire da Windows 8) e già supportato nei livelli di funzionalità 10level9.

²DXGI 1.2 ha introdotto il formato 4:4:4:4. Questo formato è facoltativamente supportato nel runtime di DirectX 11.1, necessario per le schede video di livello 11.1 e i driver WDDM 1.2 e già supportati nei livelli di funzionalità 10level9.

Per i formati non compressi, DXGI ha limitato il supporto per modelli di formato pixel arbitrari; tutti i formati non compressi devono essere di tipo RGBA. Ciò potrebbe richiedere lo scorrimento rapido dei formati pixel degli asset esistenti, che è consigliabile calcolare come passaggio di pre-elaborazione offline, se possibile.

Porting shader

Gli shader Direct3D 10 vengono creati in HLSL

Direct3D 10 limita l'uso del linguaggio assembly solo a scopo di debug, pertanto qualsiasi assembly shader scritto a mano usato in Direct3D 9 dovrà essere convertito in HLSL.

Firme shader e collegamento

In precedenza in questo documento sono stati illustrati i requisiti per il collegamento all'assembly di input dell'assembly di input al vertex shader (vedere sopra). Si noti che il runtime di Direct3D 10 ha anche ristretto i requisiti per la fase di collegamento tra shader. Questa modifica influirà sulle origini dello shader in cui l'associazione tra le fasi potrebbe non essere stata descritta completamente in Direct3D 9. Ad esempio:

VS_OUTPUT                       PS_INPUT
float4   pos : SV_POSITION;     float4 pos : SV_POSITION;
float4   uv1 : TEXCOORD1;       float4 uv1 : TEXCOORD1;
float4x3 tangentSp : TEXCOORD2; float4 tangent : TEXCOORD2; *
float4   Color : TEXCOORD6;     float4 color : TEXCOORD6;

* Broken VS - PS Linkage - anche se il pixel shader potrebbe non essere interessato alla matrice completa, il collegamento deve specificare il float4x3 completo.

Si noti che la semantica di collegamento tra le fasi deve corrispondere esattamente, ma gli input delle fasi di destinazione possono essere un prefisso dei valori restituiti. Nell'esempio precedente, il pixel shader potrebbe avere posizione e texcoord1 come unici input, ma non poteva avere la posizione e il texcoord2 come unici input a causa dei vincoli di ordinamento.

Collegamenti alla fase shader HLSL

Il collegamento tra shader può verificarsi in uno dei punti seguenti nella pipeline:

  • Assembler di input in Vertex Shader
  • Vertex Shader in Pixel Shader
  • Vertex Shader to Geometry Shader
  • Vertex Shader to Stream Output
  • Geometry Shader to Pixel Shader
  • Geometry Shader to Stream Out

Buffer costanti

Per semplificare la conversione del contenuto da Direct3D 9, un approccio iniziale alla gestione costante all'esterno del sistema Effects potrebbe comportare la creazione di un singolo buffer costante contenente tutte le costanti richieste. È importante per le prestazioni ordinare le costanti in buffer in base alla frequenza prevista di aggiornamento. Questa organizzazione ridurrà al minimo la quantità di set di costanti ridondanti.

Piani di ritaglio utente in HLSL al livello di funzionalità 9 e superiore

A partire da Windows 8, è possibile usare l'attributo della funzione Clipplanes in una dichiarazione di funzione HLSL anziché SV_ClipDistance per rendere il lavoro dello shader a livello di funzionalità 9_x nonché il livello di funzionalità 10 e superiore. Per altre info, vedi Piani clip utente su hardware di livello 9.

Differenze aggiuntive per Direct3D 10 da controllare

Numeri interi come input

In Direct3D 9 non è disponibile alcun supporto hardware reale per i tipi di dati Integer, ma l'hardware Direct3D 10 supporta tipi integer espliciti. Se nel buffer dei vertici sono presenti dati a virgola mobile, è necessario disporre di un input float. In caso contrario, un tipo integer sarà la rappresentazione del criterio di bit del valore a virgola mobile. Un tipo integer non è consentito per un input pixel shader, a meno che il valore non sia contrassegnato per nessuna interpolazione (vedere Modificatori di interpolazione).

Cursori del mouse

Nelle versioni precedenti di Windows, le routine standard del cursore del mouse GDI non funzionavano correttamente su tutti i dispositivi esclusivi a schermo intero. Le API SetCursorProperties, ShowCursor e SetCursorPosition sono state aggiunte per gestire questi casi. Poiché la versione di Windows Vista di GDI comprende completamente le superfici DXGI , non c'è bisogno di questa API specializzata del cursore del mouse, quindi non esiste alcun equivalente Direct3D 10. Le applicazioni Direct3D 10 devono invece usare le routine standard del cursore del mouse GDI per i cursori del mouse.

Mapping di texel a pixel in Direct3D 10

In Direct3D 9, i centri texel e i centri pixel erano a metà unità di distanza (vedere Mapping diretto di texel a pixel (Direct3D 9)). In Direct3D 10, i centri texel sono già a metà unità, quindi non è necessario spostare le coordinate dei vertici.

Il rendering di quad a schermo intero è più semplice con Direct3D 10. I quad a schermo intero devono essere definiti in clipspace (-1,1) e semplicemente passati attraverso il vertex shader senza modifiche. In questo modo, non è necessario ricaricare il buffer dei vertici ogni volta che cambia la risoluzione dello schermo e non c'è alcun lavoro aggiuntivo nel pixel shader per modificare le coordinate della trama.

Modifiche al comportamento di conteggio dei riferimenti

A differenza delle versioni precedenti di Direct3D, le varie funzioni Set non conterranno un riferimento agli oggetti dispositivi. Ciò significa che l'applicazione deve garantire che contenga un riferimento sull'oggetto per tutto il tempo necessario per associare l'oggetto alla pipeline. Quando il conteggio dei riferimenti dell'oggetto scende a zero, l'oggetto verrà scollegato dalla pipeline man mano che viene eliminato definitivamente. Questo stile di conservazione dei riferimenti è noto anche come trattenente di riferimento debole, pertanto ogni posizione di associazione nell'oggetto Device contiene un riferimento debole all'interfaccia/oggetto. Se non diversamente indicato in modo esplicito, questo comportamento deve essere assunto per tutti i metodi Set. Ogni volta che la distruzione di un oggetto causa l'impostazione di un punto di associazione su NULL , il livello di debug genererà un avviso. Si noti che le chiamate ai metodi Get del dispositivo, ad esempio OMGetRenderTargets, aumentano il numero di riferimenti degli oggetti restituiti.

Testare il livello cooperativo

La funzionalità di TestCooperativeLevel dell'API Direct3D 9 è analoga all'impostazione del DXGI_PRESENT_TEST quando si chiama Present.

StretchRect

Una funzione simile al metodo IDirect3D 9 IDirect3DDevice9::StretchRect non è disponibile in Direct3D 10 e 10.1. Per copiare le superfici delle risorse, usare ID3D10Device::CopySubresourceRegion. Per le operazioni di ridimensionamento, eseguire il rendering in una trama usando il filtro delle trame. Per convertire le superfici MSAA in superfici non MSAA, usare ID3D10Device::ResolveSubresource.

Differenze aggiuntive di Direct3D 10.1

Windows Vista con Service Pack 1 (SP1) includeva un aggiornamento secondario per Direct3D 10 e Direct3D 10.1, che esponeva le funzionalità hardware aggiuntive seguenti:

  • Shader MSAA per campione
  • Readback profondità MSAA
  • Modalità di fusione indipendenti per ogni destinazione di rendering
  • Matrici mappa cubo
  • Eseguire il rendering in formati compressi a blocchi (BC)

L'aggiornamento di Direct3D 10.1 ha aggiunto il supporto per le nuove interfacce seguenti, derivate dalle interfacce esistenti:

L'aggiornamento di Direct3D 10.1 include anche le strutture aggiuntive seguenti:

L'API Direct3D 10.1 include un nuovo concetto denominato livello di funzionalità. Questo concetto significa che è possibile usare l'API Direct3D 10.1 per l'unità hardware Direct3D 10.0 (D3D10_FEATURE_LEVEL_10_0) o Direct3D 10.1 (D3D10_FEATURE_LEVEL_10_1). Poiché l'API Direct3D 10.1 è derivata dalle interfacce Direct3D 10, le applicazioni possono creare un dispositivo Direct3D 10.1, quindi usarlo come dispositivo Direct3D 10.0, tranne dove sono necessarie nuove funzionalità specifiche della versione 10.1 (purché il livello di funzionalità D3D10_FEATURE_LEVEL_10_1 sia presente e supporti queste funzionalità).

Nota

I dispositivi Direct3D 10.1 possono usare i profili shader 10.0 HLSL esistenti (vs_4_0, ps_4_0, gs_4_0) e i nuovi profili 10.1 (vs_4_1, ps_4_1, gs_4_1) con istruzioni e funzionalità HLSL aggiuntive.

 

Windows 7 conteneva un aggiornamento secondario per l'API Direct3D 10.1 inclusa nel runtime direct3D 11. Questo aggiornamento aggiunge il supporto per i livelli di funzionalità seguenti:

Windows 7 ha anche aggiunto il supporto a Direct3D 10.1 per Windows Advanced Rasterization Platform (WARP). È possibile specificare un driver WARP usando D3D10_DRIVER_TYPE_WARP.

Per altre informazioni su Direct3D 10.1, vedere Funzionalità di Direct3D 10.1 e l'enumerazione D3D10_FEATURE_LEVEL1.

Guida alla programmazione per Direct3D 10