Introducció

DirectX és una col·lecció d'APIs (Application Programming Interfaces) desenvolupades per Microsoft que permeten la creació de jocs i aplicacions multimèdia d'alt rendiment. En aquest tema, explorarem els components clau de l'API de DirectX, com funcionen i com es poden utilitzar per desenvolupar aplicacions gràfiques.

Components de DirectX

DirectX està compost per diverses APIs, cadascuna especialitzada en un aspecte diferent del desenvolupament multimèdia. Els components principals són:

  1. Direct3D: Utilitzat per renderitzar gràfics 3D.
  2. Direct2D: Utilitzat per renderitzar gràfics 2D.
  3. DirectWrite: Utilitzat per renderitzar text.
  4. DirectSound: Utilitzat per gestionar l'àudio.
  5. DirectInput: Utilitzat per gestionar dispositius d'entrada com teclats, ratolins i controladors de joc.
  6. DirectPlay: Utilitzat per gestionar la comunicació en xarxa per a jocs multijugador.

Arquitectura de DirectX

L'arquitectura de DirectX es basa en una sèrie de capes que interactuen entre si per proporcionar funcionalitats avançades de gràfics i àudio. A continuació es mostra una taula que resumeix les capes principals:

Capa Descripció
Aplicació El codi de l'aplicació que utilitza les APIs de DirectX.
API de DirectX Les interfícies proporcionades per DirectX per interactuar amb el maquinari.
Controladors El programari que permet a DirectX comunicar-se amb el maquinari.
Maquinari La GPU, CPU, i altres components físics del sistema.

Interfícies Clau de DirectX

Direct3D

Direct3D és una de les APIs més importants de DirectX, ja que s'utilitza per renderitzar gràfics 3D. Les interfícies clau de Direct3D inclouen:

  • ID3D11Device: Representa el dispositiu gràfic i s'utilitza per crear recursos com buffers i textures.
  • ID3D11DeviceContext: Utilitzat per configurar l'estat del pipeline gràfic i emetre ordres de renderització.
  • IDXGISwapChain: Gestiona la cadena d'intercanvi de buffers per a la presentació de fotogrames a la pantalla.

Direct2D

Direct2D s'utilitza per renderitzar gràfics 2D amb alta qualitat. Les interfícies clau de Direct2D inclouen:

  • ID2D1Factory: Utilitzat per crear recursos de Direct2D com render targets i geometries.
  • ID2D1RenderTarget: Representa una superfície de dibuix on es poden renderitzar gràfics 2D.
  • ID2D1Brush: Utilitzat per pintar formes i text.

DirectWrite

DirectWrite proporciona funcionalitats avançades per renderitzar text. Les interfícies clau de DirectWrite inclouen:

  • IDWriteFactory: Utilitzat per crear recursos de DirectWrite com text formats i text layouts.
  • IDWriteTextFormat: Defineix les propietats de format del text com la font, mida i alineació.
  • IDWriteTextLayout: Representa el disseny del text que es renderitzarà.

Exemple Pràctic: Inicialitzar Direct3D

A continuació es mostra un exemple de codi per inicialitzar Direct3D:

#include <d3d11.h>
#include <dxgi.h>
#include <wrl.h>

using namespace Microsoft::WRL;

ComPtr<ID3D11Device> device;
ComPtr<ID3D11DeviceContext> context;
ComPtr<IDXGISwapChain> swapChain;

void InitializeDirect3D(HWND hwnd) {
    DXGI_SWAP_CHAIN_DESC scd = {};
    scd.BufferCount = 1;
    scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    scd.OutputWindow = hwnd;
    scd.SampleDesc.Count = 1;
    scd.Windowed = TRUE;

    D3D11CreateDeviceAndSwapChain(
        nullptr,
        D3D_DRIVER_TYPE_HARDWARE,
        nullptr,
        0,
        nullptr,
        0,
        D3D11_SDK_VERSION,
        &scd,
        &swapChain,
        &device,
        nullptr,
        &context
    );
}

Explicació del Codi

  1. Incloure les Llibreries: Incloem les llibreries necessàries per treballar amb Direct3D.
  2. Declarar Variables: Utilitzem ComPtr per gestionar les interfícies de Direct3D.
  3. Configurar DXGI_SWAP_CHAIN_DESC: Configurem la descripció de la cadena d'intercanvi.
  4. Crear el Dispositiu i la Cadena d'Intercanvi: Utilitzem D3D11CreateDeviceAndSwapChain per inicialitzar Direct3D.

Exercici Pràctic

Exercici

  1. Modifica l'exemple de codi anterior per configurar la cadena d'intercanvi perquè utilitzi doble buffer.
  2. Afegeix codi per crear un render target view i establir-lo com a objectiu de renderització.

Solució

#include <d3d11.h>
#include <dxgi.h>
#include <wrl.h>

using namespace Microsoft::WRL;

ComPtr<ID3D11Device> device;
ComPtr<ID3D11DeviceContext> context;
ComPtr<IDXGISwapChain> swapChain;
ComPtr<ID3D11RenderTargetView> renderTargetView;

void InitializeDirect3D(HWND hwnd) {
    DXGI_SWAP_CHAIN_DESC scd = {};
    scd.BufferCount = 2; // Doble buffer
    scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    scd.OutputWindow = hwnd;
    scd.SampleDesc.Count = 1;
    scd.Windowed = TRUE;

    D3D11CreateDeviceAndSwapChain(
        nullptr,
        D3D_DRIVER_TYPE_HARDWARE,
        nullptr,
        0,
        nullptr,
        0,
        D3D11_SDK_VERSION,
        &scd,
        &swapChain,
        &device,
        nullptr,
        &context
    );

    ComPtr<ID3D11Texture2D> backBuffer;
    swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), &backBuffer);
    device->CreateRenderTargetView(backBuffer.Get(), nullptr, &renderTargetView);
    context->OMSetRenderTargets(1, renderTargetView.GetAddressOf(), nullptr);
}

Explicació de la Solució

  1. Doble Buffer: Hem canviat BufferCount a 2 per utilitzar doble buffer.
  2. Crear Render Target View: Hem afegit codi per obtenir el back buffer i crear un render target view.
  3. Establir Render Target: Hem establert el render target view com a objectiu de renderització.

Conclusió

En aquesta secció, hem explorat els components clau de l'API de DirectX i hem vist com inicialitzar Direct3D amb un exemple pràctic. Ara que comprens les bases de l'API de DirectX, estàs preparat per avançar cap a la creació de la teva primera aplicació DirectX en el següent tema.

© Copyright 2024. Tots els drets reservats