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

  1. Incloure les Llibreries Necessàries: Incloem les llibreries de Direct3D i DirectXTK.
  2. Declarar Variables Globals: Declarem una variable global per emmagatzemar la vista de recursos de la textura.
  3. Funció LoadTexture: Aquesta funció carrega una textura des d'un arxiu utilitzant CreateWICTextureFromFile 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

  1. 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

  1. Estructura Vertex: Definim una estructura de vèrtex que inclou posició i coordenades de textura.
  2. Definir Vèrtexs: Creem un array de vèrtexs amb coordenades UV que mapejaran la textura correctament sobre un quadrat.

Exercici Pràctic

Exercici

  1. Carrega una textura des d'un arxiu.
  2. Aplica la textura a un quadrat 3D.
  3. 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.

© Copyright 2024. Tots els drets reservats