El mapatge de textures és una tècnica fonamental en la renderització 3D que permet aplicar imatges (textures) a superfícies geomètriques per donar-los un aspecte més detallat i realista. En aquest tema, aprendrem com carregar, aplicar i gestionar textures en DirectX.
Objectius del Tema
- Comprendre què és una textura i com s'utilitza en la renderització 3D.
- Aprendre a carregar textures des d'arxius.
- Aplicar textures a objectes 3D.
- Gestionar coordenades de textura (UV mapping).
Què és una Textura?
Una textura és una imatge 2D que es mapeja sobre una superfície 3D per donar-li detalls visuals. Les textures poden representar qualsevol cosa, des de colors simples fins a imatges complexes com fusta, metall, o pell.
Carregar Textures
Per carregar una textura en DirectX, necessitem utilitzar la biblioteca DirectX Tool Kit (DirectXTK), que proporciona funcions útils per treballar amb textures.
Exemple de Codi: Carregar una Textura
#include <d3d11.h> #include <DirectXTK/WICTextureLoader.h> // Variables globals ID3D11ShaderResourceView* g_pTextureRV = nullptr; // Funció per carregar una textura HRESULT LoadTexture(ID3D11Device* pd3dDevice, const wchar_t* szFileName) { HRESULT hr = DirectX::CreateWICTextureFromFile(pd3dDevice, szFileName, nullptr, &g_pTextureRV); if (FAILED(hr)) { return hr; } return S_OK; }
Explicació del Codi
- Incloure les Llibreries Necessàries: Incloem les llibreries de Direct3D i DirectXTK.
- Declarar Variables Globals: Declarem una variable global per emmagatzemar la vista de recursos de la textura.
- Funció
LoadTexture
: Aquesta funció carrega una textura des d'un arxiu utilitzantCreateWICTextureFromFile
de DirectXTK.
Aplicar Textures a Objectes 3D
Un cop carregada la textura, hem d'aplicar-la als nostres objectes 3D. Això implica configurar els shaders per utilitzar la textura durant la fase de renderització.
Exemple de Codi: Aplicar una Textura
// Configurar el shader per utilitzar la textura void SetTexture(ID3D11DeviceContext* pContext) { pContext->PSSetShaderResources(0, 1, &g_pTextureRV); }
Explicació del Codi
- Funció
SetTexture
: Aquesta funció configura el context del dispositiu per utilitzar la textura en el pixel shader.
Gestionar Coordenades de Textura (UV Mapping)
Les coordenades de textura (UV) determinen com es mapeja la textura sobre la superfície de l'objecte. Cada vèrtex de l'objecte té associades coordenades UV que indiquen quina part de la textura s'aplica a aquest vèrtex.
Exemple de Codi: Definir Coordenades UV
struct Vertex { DirectX::XMFLOAT3 Pos; DirectX::XMFLOAT2 Tex; }; // Definir vèrtexs amb coordenades UV Vertex vertices[] = { { DirectX::XMFLOAT3(-1.0f, -1.0f, 0.0f), DirectX::XMFLOAT2(0.0f, 1.0f) }, { DirectX::XMFLOAT3(1.0f, -1.0f, 0.0f), DirectX::XMFLOAT2(1.0f, 1.0f) }, { DirectX::XMFLOAT3(1.0f, 1.0f, 0.0f), DirectX::XMFLOAT2(1.0f, 0.0f) }, { DirectX::XMFLOAT3(-1.0f, 1.0f, 0.0f), DirectX::XMFLOAT2(0.0f, 0.0f) }, };
Explicació del Codi
- Estructura
Vertex
: Definim una estructura de vèrtex que inclou posició i coordenades de textura. - Definir Vèrtexs: Creem un array de vèrtexs amb coordenades UV que mapejaran la textura correctament sobre un quadrat.
Exercici Pràctic
Exercici
- Carrega una textura des d'un arxiu.
- Aplica la textura a un quadrat 3D.
- Renderitza el quadrat amb la textura aplicada.
Solució
// Incloure les llibreries necessàries #include <d3d11.h> #include <DirectXTK/WICTextureLoader.h> // Variables globals ID3D11ShaderResourceView* g_pTextureRV = nullptr; // Funció per carregar una textura HRESULT LoadTexture(ID3D11Device* pd3dDevice, const wchar_t* szFileName) { HRESULT hr = DirectX::CreateWICTextureFromFile(pd3dDevice, szFileName, nullptr, &g_pTextureRV); if (FAILED(hr)) { return hr; } return S_OK; } // Configurar el shader per utilitzar la textura void SetTexture(ID3D11DeviceContext* pContext) { pContext->PSSetShaderResources(0, 1, &g_pTextureRV); } // Estructura de vèrtex struct Vertex { DirectX::XMFLOAT3 Pos; DirectX::XMFLOAT2 Tex; }; // Definir vèrtexs amb coordenades UV Vertex vertices[] = { { DirectX::XMFLOAT3(-1.0f, -1.0f, 0.0f), DirectX::XMFLOAT2(0.0f, 1.0f) }, { DirectX::XMFLOAT3(1.0f, -1.0f, 0.0f), DirectX::XMFLOAT2(1.0f, 1.0f) }, { DirectX::XMFLOAT3(1.0f, 1.0f, 0.0f), DirectX::XMFLOAT2(1.0f, 0.0f) }, { DirectX::XMFLOAT3(-1.0f, 1.0f, 0.0f), DirectX::XMFLOAT2(0.0f, 0.0f) }, }; // Funció principal int main() { // Inicialitzar Direct3D, carregar la textura i configurar el shader // (Codi d'inicialització de Direct3D omès per brevetat) // Carregar la textura LoadTexture(pd3dDevice, L"texture.jpg"); // Configurar el shader per utilitzar la textura SetTexture(pContext); // Renderitzar el quadrat amb la textura aplicada // (Codi de renderització omès per brevetat) return 0; }
Resum
En aquest tema, hem après què són les textures i com carregar-les, aplicar-les i gestionar les coordenades de textura en DirectX. Aquestes habilitats són essencials per crear aplicacions 3D realistes i detallades. En el proper tema, explorarem tècniques avançades d'il·luminació per millorar encara més la qualitat visual de les nostres aplicacions.
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