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:
- Direct3D: Utilitzat per renderitzar gràfics 3D.
- Direct2D: Utilitzat per renderitzar gràfics 2D.
- DirectWrite: Utilitzat per renderitzar text.
- DirectSound: Utilitzat per gestionar l'àudio.
- DirectInput: Utilitzat per gestionar dispositius d'entrada com teclats, ratolins i controladors de joc.
- 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
- Incloure les Llibreries: Incloem les llibreries necessàries per treballar amb Direct3D.
- Declarar Variables: Utilitzem
ComPtrper gestionar les interfícies de Direct3D. - Configurar DXGI_SWAP_CHAIN_DESC: Configurem la descripció de la cadena d'intercanvi.
- Crear el Dispositiu i la Cadena d'Intercanvi: Utilitzem
D3D11CreateDeviceAndSwapChainper inicialitzar Direct3D.
Exercici Pràctic
Exercici
- Modifica l'exemple de codi anterior per configurar la cadena d'intercanvi perquè utilitzi doble buffer.
- 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ó
- Doble Buffer: Hem canviat
BufferCounta 2 per utilitzar doble buffer. - Crear Render Target View: Hem afegit codi per obtenir el back buffer i crear un render target view.
- 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.
Curs de Programació DirectX
Mòdul 1: Introducció a DirectX
- Què és DirectX?
- Configuració de l'Entorn de Desenvolupament
- Comprendre l'API de DirectX
- Crear la Teva Primera Aplicació DirectX
Mòdul 2: Conceptes Bàsics de Direct3D
- Introducció a Direct3D
- Inicialitzar Direct3D
- Renderitzar un Triangle
- Gestionar el Bucle de Renderització
Mòdul 3: Treballar amb Shaders
Mòdul 4: Tècniques Avançades de Renderització
Mòdul 5: Models 3D i Animació
Mòdul 6: Optimització del Rendiment
- Perfilat i Depuració
- Optimitzar el Rendiment de la Renderització
- Gestió de Memòria
- Multifil en DirectX
