6. Текстурирование

    Текстурирование в Direct3D - это процесс автоматизированный до крайней степени. Однако, некоторые вещи стоит рассмотреть. Начнем с текстурных координат.
    Каждый тексель (пиксель текстуры) задается парой координат. При этом, отсчет ведется от левого верхнего угла текстуры, и вертикальная ось направлена вниз. Вообще говоря, текстурными координатами могут служить любые положительные числа, но лучше, когда координаты принадлежат диапазону [0, 1]. Такие координаты называются нормализованными. Итак, чтобы покрасить пиксель в цвет определенного текселя, нужно явно (координатами) задать, какая точка текстуры будет использована. Для этого, расширим нашу запись с данными о точке, добавив туда текстурные координаты:

    struct TexturedVertex
    {
       float x, y, z;
       float nx, ny, nz;
       float u, v; //текстурные координаты
       static const DWORD FVF;
    };
    const DWORD TexturedVertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;

    В Direct3D текстура задается с помощью объекта IDirect3DTexture9. Чтобы загрузить текстуру из файла, нужно использовать процедуру HRESULT D3DXCreateTextureFromFile. Рассмотрим её описание:

    HRESULT D3DXCreateTextureFromFile(
       LPDIRECT3DDEVICE9 pDevice,
       LPCSTR pSrcFile,
       LPDIRECT3DTEXTURE9* ppTexture);

    pDevice - устройство визуализации.
    pSrcFile - имя файла с текстурой.
    ppTexture - возвращаемый указатель на текстуру.

    Чтобы задать, какую текстуру использовать при визуализации, нужно использовать метод HRESULT IDirect3DDevice9::SetTexture.

    HRESULT IDirect3DDevice9::SetTexture(
       DWORD Stage,
       IDirect3DBaseTexture9* pTexture);

    Stage - индекс в цепочке мультитекстурирования.
    pTexture - указатель на текстуру.

    Если грань по размерам не соответствует текстуре, то текстура автоматически изменяется до размеров грани. После этого, при визуализации, возникают искажения. Для того, чтобы уменьшить эти искажения, применяют фильтрацию текстур. Тип фильтрации задается методом IDirect3DDevice9::SetSamplerState.

    //выборка ближайшей точки
    рDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
    рDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);

    //линейная фильтрация
    рDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
    рDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);

    //анизотропная фильтрация
    рDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC);
    рDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);

    //степень анизотропной фильтрации
    рDevice->SetSamplerState(0, D3DSAMP_MAXANISOTROPY, 4);

При использовании функции HRESULT D3DXCreateTextureFromFile, генерируется не одна текстура, а несколько, разных размеров. Когда грань изменяется в размерах, например, уменьшается, то она текстурируется все более маленькой по размерам (и менее детализированной) текстурой. Это, так называемый, метод детализации текстур (mip-mapping). Существует фильтр детализации текстур.

    рDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, f);

    Где f - одна из следующих констант: D3DTEXF_NONE, D3DTEXF_POINT, D3DTEXF_LINEAR.

    Пример приложения: "Текстурированная плоскость"