DirectX 8. Начинаем работу с DirectX Graphics (Ваткин, Dempski) - страница 14

>g_pD3DDevice->SetTextureStageState(0, D3DTSS_MAGFILTER, CurrentFilter);

>g_pD3DDevice->SetTextureStageState(0, D3DTSS_MINFILTER, CurrentFilter);

>g_pD3DDevice->SetTextureStageState(0, D3DTSS_MIPFILTER, CurrentFilter);

Перед рендерингом из VB, необходимо задать сам буфер и формат вершин, что делается следующими двумя строками:

>g_pD3DDevice->SetStreamSource(0, g_pVB, sizeof(MYVERTEX));

>g_pD3DDevice->SetVertexShader(D3DFVF_MYVERTEX);

И, наконец! Все готово для рендеринга! Делается это всего одной функцией DrawPrimitive(). Первый параметр говорит о том, в каком виде хранятся в VB вершины. В нашем случае, объект задается последовательностью треугольников (D3DPT_TRIANGLELIST). Второй параметр говорит о том, с какой по номеру вершины из VB начинать отрисовку. Третий параметр — количество примитивов (в нашем случае треугольников), которые требуется отрендерить.

>g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 4);

Завершаем сцену:

>g_pD3DDevice->EndScene();

Отображаем бэк-буфер на экране:

>g_pD3DDevice->Present(NULL, NULL, NULL, NULL);

Функция Deinitialization()

Для освобождения большинства (если не всех) видов ресурсов в D3D используется функция Release():

>if (g_pTexture != NULL) g_pTexture->Release();

>if (g_pVB != NULL) g_pVB->Release();

>if (g_pD3DDevice != NULL) g_pD3DDevice->Release();

>if (g_pD3D != NULL) g_pD3D->Release();

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

>UnregisterClass("PyramidClass", wclass.hInstance);

Функция MessageProc()

Программа будет обрабатывать только два типа сообщений: WM_KEYDOWN (нажата клавиша) и WM_DESTROY (уничтожено окно приложения).

При поступлении сообщения WM_KEYDOWN получаем виртуальный код нажатой клавиши:

>case WM_KEYDOWN:

> int VK;

> VK = (int)wParam;

Из клавиш, обрабатываем только Esc, F1, F2, F3, F4. При нажатии на Esc программа должна завершиться, как ни парадоксально это звучит :)) Если нажата клавиша F1-F4, должен смениться тип фильтра (переменная CurrentFilter) и заголовок окна:

>switch(VK) {

>case VK_ESCAPE:

> PostQuitMessage(0);

> return 0;

>  //...

>case VK_F2:

> CurrentFilter = D3DTEXF_POINT;

> SetWindowText(hWnd, "D3D Pyramid (Filter=D3DTEXF_POINT)");

> break;

> //...

>}

При поступлении сообщения WM_DESTROY, выполняются действия, аналогичные производящимся при обработке клавиши Esc:

>case WM_DESTROY:

> PostQuitMessage(0);

> return 0;

Приехали! В принципе, вышеизложенного материала достаточно для самостоятельного написания простых 3D-приложений (для написания игры необходимо, как минимум, уметь работать с матрицами). Рекомендую поэкспериментировать с примером к данной статье. Попробуй поиграть настройками D3D, параметрами функций. Дай волю своему воображению! И, конечно же, попытайся написать что-нибудь сам (например, вращающийся треугольник или куб). Только так можно научиться. Накапливай опыт…