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
ComPtr
per 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
D3D11CreateDeviceAndSwapChain
per 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
BufferCount
a 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