Què és Direct3D?

Direct3D és una part de l'API DirectX de Microsoft, dissenyada específicament per a la programació gràfica en 3D. És àmpliament utilitzada en el desenvolupament de videojocs i aplicacions gràfiques per a Windows. Direct3D proporciona una interfície de programació que permet als desenvolupadors accedir directament al maquinari gràfic, oferint un alt rendiment i flexibilitat.

Conceptes Clau de Direct3D

  1. Dispositiu Direct3D (Device): És l'objecte principal que representa la interfície amb el maquinari gràfic. Permet la creació de recursos gràfics i la configuració de l'estat de renderització.
  2. Context de Dispositiu (Device Context): Utilitzat per emetre ordres de dibuix i configurar l'estat de renderització.
  3. Swap Chain: Una sèrie de buffers que s'utilitzen per a la presentació de fotogrames a la pantalla.
  4. Buffers: Memòria utilitzada per emmagatzemar dades com ara vèrtexs, índexs i textures.
  5. Shaders: Programes que s'executen en la GPU per processar vèrtexs i píxels.

Arquitectura de Direct3D

Direct3D segueix una arquitectura basada en objectes, on cada component té una funció específica. A continuació es presenta una taula amb els components principals i les seves funcions:

Component Funció
Dispositiu Interfície amb el maquinari gràfic.
Context de Dispositiu Emissió d'ordres de dibuix i configuració de l'estat de renderització.
Swap Chain Gestió de buffers per a la presentació de fotogrames.
Buffers Emmagatzematge de dades gràfiques.
Shaders Processament de vèrtexs i píxels en la GPU.

Crear un Dispositiu Direct3D

Per començar a treballar amb Direct3D, primer hem de crear un dispositiu Direct3D i un context de dispositiu. A continuació es mostra un exemple de codi en C++ per a la creació d'un dispositiu Direct3D:

#include <d3d11.h>
#pragma comment (lib, "d3d11.lib")

// Variables globals
ID3D11Device* g_pd3dDevice = nullptr;
ID3D11DeviceContext* g_pImmediateContext = nullptr;
IDXGISwapChain* g_pSwapChain = nullptr;

HRESULT InitDevice()
{
    HRESULT hr = S_OK;

    // Descripció del swap chain
    DXGI_SWAP_CHAIN_DESC sd;
    ZeroMemory(&sd, sizeof(sd));
    sd.BufferCount = 1;
    sd.BufferDesc.Width = 800;
    sd.BufferDesc.Height = 600;
    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    sd.BufferDesc.RefreshRate.Numerator = 60;
    sd.BufferDesc.RefreshRate.Denominator = 1;
    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    sd.OutputWindow = hWnd; // hWnd és el manejador de la finestra
    sd.SampleDesc.Count = 1;
    sd.SampleDesc.Quality = 0;
    sd.Windowed = TRUE;

    // Creació del dispositiu i el swap chain
    hr = D3D11CreateDeviceAndSwapChain(
        nullptr,
        D3D_DRIVER_TYPE_HARDWARE,
        nullptr,
        0,
        nullptr,
        0,
        D3D11_SDK_VERSION,
        &sd,
        &g_pSwapChain,
        &g_pd3dDevice,
        nullptr,
        &g_pImmediateContext
    );

    if (FAILED(hr))
    {
        return hr;
    }

    return S_OK;
}

Explicació del Codi

  1. Incloure les Llibreries: Incloem la llibreria d3d11.h i enllacem amb d3d11.lib.
  2. Variables Globals: Declarem variables globals per al dispositiu, el context de dispositiu i el swap chain.
  3. Descripció del Swap Chain: Configurem la descripció del swap chain, especificant la resolució, el format de píxel, la taxa de refresc, l'ús del buffer i el mode de finestra.
  4. Creació del Dispositiu i el Swap Chain: Utilitzem la funció D3D11CreateDeviceAndSwapChain per crear el dispositiu Direct3D, el context de dispositiu i el swap chain.

Exercici Pràctic

Exercici 1: Crear un Dispositiu Direct3D

Objectiu: Crear un dispositiu Direct3D i un context de dispositiu en una aplicació de Windows.

Passos:

  1. Configura un projecte de C++ en Visual Studio.
  2. Inclou les llibreries necessàries (d3d11.h).
  3. Declara les variables globals per al dispositiu, el context de dispositiu i el swap chain.
  4. Implementa la funció InitDevice per crear el dispositiu Direct3D i el swap chain.
  5. Crida la funció InitDevice des de la funció principal de la teva aplicació.

Solució:

#include <d3d11.h>
#include <windows.h>
#pragma comment (lib, "d3d11.lib")

// Variables globals
ID3D11Device* g_pd3dDevice = nullptr;
ID3D11DeviceContext* g_pImmediateContext = nullptr;
IDXGISwapChain* g_pSwapChain = nullptr;
HWND hWnd;

HRESULT InitDevice()
{
    HRESULT hr = S_OK;

    // Descripció del swap chain
    DXGI_SWAP_CHAIN_DESC sd;
    ZeroMemory(&sd, sizeof(sd));
    sd.BufferCount = 1;
    sd.BufferDesc.Width = 800;
    sd.BufferDesc.Height = 600;
    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    sd.BufferDesc.RefreshRate.Numerator = 60;
    sd.BufferDesc.RefreshRate.Denominator = 1;
    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    sd.OutputWindow = hWnd;
    sd.SampleDesc.Count = 1;
    sd.SampleDesc.Quality = 0;
    sd.Windowed = TRUE;

    // Creació del dispositiu i el swap chain
    hr = D3D11CreateDeviceAndSwapChain(
        nullptr,
        D3D_DRIVER_TYPE_HARDWARE,
        nullptr,
        0,
        nullptr,
        0,
        D3D11_SDK_VERSION,
        &sd,
        &g_pSwapChain,
        &g_pd3dDevice,
        nullptr,
        &g_pImmediateContext
    );

    if (FAILED(hr))
    {
        return hr;
    }

    return S_OK;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    // Inicialització de la finestra (no es mostra aquí per simplicitat)
    // ...

    // Inicialització de Direct3D
    if (FAILED(InitDevice()))
    {
        return 0;
    }

    // Bucle principal de la finestra (no es mostra aquí per simplicitat)
    // ...

    return 0;
}

Conclusió

En aquesta secció, hem introduït els conceptes bàsics de Direct3D i hem après a crear un dispositiu Direct3D i un context de dispositiu. Aquests són els fonaments per començar a treballar amb Direct3D i renderitzar gràfics en 3D. En la següent secció, explorarem com inicialitzar Direct3D i preparar-lo per a la renderització.

© Copyright 2024. Tots els drets reservats