>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, параметрами функций. Дай волю своему воображению! И, конечно же, попытайся написать что-нибудь сам (например, вращающийся треугольник или куб). Только так можно научиться. Накапливай опыт…