netlib.narod.ru< Назад | Оглавление | Далее >

6.6. Пример приложения: текстурированный квадрат

Пример приложения из этой главы показывает как текстурировать квадрат и установить фильтр текстуры (рис. 6.9). Если видеокарта поддерживает детализацию текстур, при загрузке текстуры функцией D3DXCreateTextureFromFile будет автоматически создана цепочка текстур с понижающейся детализацией.


Рис. 6.9. Окно приложения TexQuad

Рис. 6.9. Окно с изображением текстурированого квадрата, полученное в приложении TexQuad


 

ПРИМЕЧАНИЕ
В сопроводительных файлах есть еще два примера приложений для данной главы. Один пример отображает куб с наложенной текстурой деревянного ящика (рис. 6.1). Другой пример демонстрирует различные режимы адресации.

Для добавления к сцене текстур объектов необходимо выполнить следующие действия:

  1. Создать вершины объектов, содержащие заданные координаты текстур.

  2. Загрузить текстуру в интерфейс IDirect3DTexture9 с помошью метода D3DXCreateTextureFromFile.

  3. Установить фильтры для увеличения, уменьшения и детализации текстур.

  4. Перед тем, как рисовать объект, указать связанную с объектом текстуру с помощью метода IDirect3DDevice9::SetTexture.

Мы начинаем с объявления нескольких глобальных переменных — одной для глобального буфера вершин, хранящего данные вершин квадрата, и другой для текстуры, которая будет накладываться на квадрат:

IDirect3DVertexBuffer9* Quad = 0;
IDirect3DTexture9*       Tex = 0;

Функция Setup достаточно прямолинейна; мы создаем квадрат из двух треугольников и задаем для них координаты текстуры. Затем мы загружаем файл с растровым изображением dx5_logo.bmp в интерфейс IDirect3DTexture9. Теперь мы можем разрешить использование текстур с помощью метода SetTexture. После вышеописанных действий мы указываем, что для уменьшения и увеличения текстур используется линейная фильтрация, и устанавливаем фильтр детализации текстур D3DTEXF_POINT:

bool Setup()
{
     Device->CreateVertexBuffer(
                    6 * sizeof(Vertex),
                    D3DUSAGE_WRITEONLY,
                    Vertex::FVF,
                    D3DPOOL_MANAGED,
                    &Quad,
                    0);

     Vertex* v;
     Quad->Lock(0, 0, (void**)&v, 0);

     // Квадрат состоит из двух треугольников,
     // обратите внимание на координаты текстур:
     v[0] = Vertex(-1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
     v[1] = Vertex(-1.0f,  1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
     v[2] = Vertex( 1.0f,  1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);

     v[3] = Vertex(-1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f);
     v[4] = Vertex( 1.0f,  1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f);
     v[5] = Vertex( 1.0f, -1.0f, 1.25f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f);

     Quad->Unlock();

     // Загрузка данных текстуры
     D3DXCreateTextureFromFile(
                    Device,
                    "dx5_logo.bmp",
                    &Tex);

     // Разрешаем текстурирование
     Device->SetTexture(0, Tex);

     // Устанавливаем фильтры текстуры
     Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
     Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
     Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

     // Задаем матрицу проекции
     D3DXMATRIX proj;
     D3DXMatrixPerspectiveFovLH(
                    &proj,
                    D3DX_PI * 0.5f, // 90 градусов
                    (float)Width / (float)Height,
                    1.0f,
                    1000.0f);
     Device->SetTransform(D3DTS_PROJECTION, &proj);

     // Не использовать в этом примере освещение
     Device->SetRenderState(D3DRS_LIGHTING, false);

     return true;
}

Теперь мы можем визуализировать наш квадрат обычным способом и на его будет наложена указанная текстура:

bool Display(float timeDelta)
{
     if (Device)
     {
          Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                        0xffffffff, 1.0f, 0);
          Device->BeginScene();

          Device->SetStreamSource(0, Quad, 0, sizeof(Vertex));
          Device->SetFVF(Vertex::FVF);

          // Рисуем примитив с наложением указанной текстуры
          Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);

          Device->EndScene();
          Device->Present(0, 0, 0, 0);
     }
     return true;
}

netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz