El mapeo de texturas es una técnica fundamental en gráficos 3D que permite aplicar imágenes (texturas) a superficies de modelos 3D para darles un aspecto más detallado y realista. En este tema, aprenderemos cómo implementar el mapeo de texturas en DirectX.

Conceptos Clave

  1. Textura: Una imagen que se aplica a la superficie de un modelo 3D.
  2. Coordenadas UV: Coordenadas que mapean puntos en la textura a puntos en la superficie del modelo.
  3. Sampler: Un objeto que define cómo se accede a la textura y cómo se filtran los valores de la textura.

Pasos para Implementar el Mapeo de Texturas

  1. Cargar la Textura

Primero, necesitamos cargar la textura desde un archivo. DirectX proporciona varias formas de hacerlo, pero una de las más comunes es usar la biblioteca DirectXTK (DirectX Tool Kit).

#include "DDSTextureLoader.h"

// Cargar la textura
Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> textureView;
HRESULT hr = DirectX::CreateDDSTextureFromFile(device, L"texture.dds", nullptr, textureView.GetAddressOf());
if (FAILED(hr)) {
    // Manejar el error
}

  1. Configurar el Sampler

El sampler define cómo se accede a la textura. Debemos crear un objeto ID3D11SamplerState y configurarlo.

D3D11_SAMPLER_DESC samplerDesc = {};
samplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
samplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
samplerDesc.ComparisonFunc = D3D11_COMPARISON_NEVER;
samplerDesc.MinLOD = 0;
samplerDesc.MaxLOD = D3D11_FLOAT32_MAX;

Microsoft::WRL::ComPtr<ID3D11SamplerState> samplerState;
hr = device->CreateSamplerState(&samplerDesc, samplerState.GetAddressOf());
if (FAILED(hr)) {
    // Manejar el error
}

  1. Configurar el Shader

Debemos modificar nuestros shaders para aceptar y usar la textura. Aquí hay un ejemplo de un vertex shader y un pixel shader que usan una textura.

Vertex Shader (HLSL)

struct VS_INPUT {
    float3 Pos : POSITION;
    float2 Tex : TEXCOORD0;
};

struct PS_INPUT {
    float4 Pos : SV_POSITION;
    float2 Tex : TEXCOORD0;
};

PS_INPUT VS(VS_INPUT input) {
    PS_INPUT output;
    output.Pos = mul(worldViewProj, float4(input.Pos, 1.0f));
    output.Tex = input.Tex;
    return output;
}

Pixel Shader (HLSL)

Texture2D texture0 : register(t0);
SamplerState sampler0 : register(s0);

struct PS_INPUT {
    float4 Pos : SV_POSITION;
    float2 Tex : TEXCOORD0;
};

float4 PS(PS_INPUT input) : SV_Target {
    return texture0.Sample(sampler0, input.Tex);
}

  1. Renderizar con la Textura

Finalmente, debemos asegurarnos de que la textura y el sampler estén vinculados al pipeline de renderizado antes de dibujar.

context->PSSetShaderResources(0, 1, textureView.GetAddressOf());
context->PSSetSamplers(0, 1, samplerState.GetAddressOf());

// Dibujar el modelo
context->DrawIndexed(indexCount, 0, 0);

Ejercicio Práctico

Ejercicio 1: Aplicar una Textura a un Cubo

  1. Objetivo: Aplicar una textura a un cubo 3D y renderizarlo.
  2. Pasos:
    • Cargar una textura desde un archivo.
    • Configurar un sampler.
    • Modificar los shaders para usar la textura.
    • Renderizar el cubo con la textura aplicada.

Solución

  1. Cargar la Textura: Usa el código proporcionado anteriormente para cargar una textura.
  2. Configurar el Sampler: Usa el código proporcionado anteriormente para configurar un sampler.
  3. Modificar los Shaders: Usa los ejemplos de shaders proporcionados anteriormente.
  4. Renderizar el Cubo: Asegúrate de que las coordenadas UV estén correctamente configuradas en el modelo del cubo.
// Asumiendo que ya tienes un cubo con coordenadas UV configuradas
context->PSSetShaderResources(0, 1, textureView.GetAddressOf());
context->PSSetSamplers(0, 1, samplerState.GetAddressOf());

// Dibujar el cubo
context->DrawIndexed(cubeIndexCount, 0, 0);

Conclusión

En esta sección, hemos aprendido cómo aplicar texturas a modelos 3D en DirectX. Hemos cubierto los conceptos clave del mapeo de texturas, cómo cargar texturas, configurar samplers, modificar shaders y renderizar modelos con texturas aplicadas. En el próximo tema, exploraremos técnicas avanzadas de iluminación para mejorar aún más el realismo de nuestras escenas 3D.

© Copyright 2024. Todos los derechos reservados