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
- 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ó.
- Context de Dispositiu (Device Context): Utilitzat per emetre ordres de dibuix i configurar l'estat de renderització.
- Swap Chain: Una sèrie de buffers que s'utilitzen per a la presentació de fotogrames a la pantalla.
- Buffers: Memòria utilitzada per emmagatzemar dades com ara vèrtexs, índexs i textures.
- 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
- Incloure les Llibreries: Incloem la llibreria
d3d11.h
i enllacem ambd3d11.lib
. - Variables Globals: Declarem variables globals per al dispositiu, el context de dispositiu i el swap chain.
- 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.
- 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:
- Configura un projecte de C++ en Visual Studio.
- Inclou les llibreries necessàries (
d3d11.h
). - Declara les variables globals per al dispositiu, el context de dispositiu i el swap chain.
- Implementa la funció
InitDevice
per crear el dispositiu Direct3D i el swap chain. - 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ó.
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