netlib.narod.ru | < Назад | Оглавление | Далее > |
Пример приложения из этой главы показывает как текстурировать квадрат и установить фильтр текстуры (рис. 6.9). Если видеокарта поддерживает детализацию текстур, при загрузке текстуры функцией D3DXCreateTextureFromFile будет автоматически создана цепочка текстур с понижающейся детализацией.
Рис. 6.9. Окно с изображением текстурированого квадрата, полученное в приложении TexQuad
Для добавления к сцене текстур объектов необходимо выполнить следующие действия:
Создать вершины объектов, содержащие заданные координаты текстур.
Загрузить текстуру в интерфейс IDirect3DTexture9 с помошью метода D3DXCreateTextureFromFile.
Установить фильтры для увеличения, уменьшения и детализации текстур.
Перед тем, как рисовать объект, указать связанную с объектом текстуру с помощью метода 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 | < Назад | Оглавление | Далее > |