Сергей Ваткин - DirectX 8. Начинаем работу с DirectX Graphics
- Название:DirectX 8. Начинаем работу с DirectX Graphics
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Сергей Ваткин - DirectX 8. Начинаем работу с DirectX Graphics краткое содержание
DirectX 8. Начинаем работу с DirectX Graphics - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
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);
Для освобождения большинства (если не всех) видов ресурсов в 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);
Программа будет обрабатывать только два типа сообщений: 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, параметрами функций. Дай волю своему воображению! И, конечно же, попытайся написать что-нибудь сам (например, вращающийся треугольник или куб). Только так можно научиться. Накапливай опыт…
Удачи!
Примечания:
1. Помни, что для компиляции программ, использующих D3DX, необходимо подключить библиотечный файл d3dx8.lib (вместе с d3d8.lib)! Еще раз напомню, как это можно сделать:
a. Project->Settings…
b. Вкладка "Link"
c. В строке "Object/library modules" добавь в начало "d3d8.lib d3dx8.lib"
d. Должно получиться примерно следующее: "d3d8.lib d3dx8.lib kernel32.lib user32.lib gdi32.lib…"
2. Программе необходим файл texture.jpg — он должен лежать в той же директории, что и exe'шник.
Полезные статьи:
Автор: voxatu.Первые шаги под DirectX 8. (Часть 1)
Первым делом вам нужно убедиться, что на вашей машине установлен компилятор C++ и DirectX8 SDK. Если у вас нет DirectX8 SDK, его можно скачать с сайта Microsoft, учтите только, что скачиваемый файл занимает примерно 140 Мб.
Дальше необходимо немного подстроить вашу среду разработки, а именно указать рабочие пути к DirectX, то есть к заголовочным файлам (.h — файлам) и файлам статических библиотек (.lib). Например, В Visual C++ это делается следующим образом. Меню Tools/Options вызывает диалоговое окно Options. В нем выбираем закладку Directories и выбираем из списка Show directories for сперва Include files для пути к заголовочным файлам, затем добавляем путь (папка Include в каталоге, куда установлен DirectX SDK) и выставляем его, нажимая на иконку "стрелочка вверх", в первую позицию. Аналогично и для пути к библиотечным файлам, выбираем из списка Show directories for пункт Library files и добавляем путь к библиотечным файлам (директория LIB в каталоге DirectX SDK).
Теперь попробуем написать простейшую программу, инициализирующую DirectX. Для этого познакомимся с некоторыми интерфейсами Direct3D и их методами.
Для создания объекта d3d используется функция Direct3DCreate8():
pD3D = Direct3DCreate8(D3D_SDK_VERSION);
здесь pD3D — указатель на интерфейс IDirect3D8, D3D_SDK_VERSION
объявлено в d3d8.h.
Файл d3d8.h содержит объявления функций, работающих с Direct3D. Поэтому его необходимо включить в свой код директивой препроцессора:
#include
Функция Direct3DCreate8() возвращает указатель на созданный объект d3d. Если она вернула значение NULL, то это означает, что ваша программа не может инициализировать DirectX8. В этом случае ваша программа должна закончить своё выполнение.
Компонент, который занимается просчётом объектов на экран в Direct3D, называется Direct3D device. Он также включает в себя и сохраняет установки, касающиеся просчёта, занимается операциями трансформации, освещения и растеризацией. Метод CreateDevice() интерфейса объекта d3d создаёт такой device. Одним из параметров этого метода является объект структурного типа D3DPRESENT_PARAMETERS. Для ознакомления с Direct3D, мы не будем углубляться в значения всех полей этой структуры. Скажем только про те, которые нам сейчас понадобятся. Поле Windowed отвечает за то, будет ли графика отображаться на весь экран или в окне; значение может быть соответственно FALSE или TRUE.
Чтобы не было видно, как перерисовывается графика, все отображаемые объекты выводят сперва в невидимой области видеопамяти, так называемой back buffer (задний буфер). После того, как кадр полностью прорисован, его копируют в видимую область памяти — front buffer или render target. Если приложение отображает графику на весь экран, то в копировании нет необходимости, достаточно просто говорить Direct3D какая часть видеопамяти является видимой, то есть просто переключать (flip) видимость с одного буфера на другой. Ясно, что если мы выводим графику в окно, то мы можем пользоваться только копированием back buffer'а в front buffer. Поле SwapEffect мы выставим в значение d3dswapeffect_discard чтобы наиболее эффективно представить back buffer для отображения.
BackBufferFormat — ещё одно поле структуры D3DPRESENT_PARAMETERS, которое нам необходимо задать, чтобы сказать Direct3D, какого формата будет back buffer. Пусть наше приложение, для простоты, будет выводить графику в окно. Формат back buffer'а должен совпадать с форматом front buffer'а, который в свою очередь в нашем случае совпадает с текущим форматом desktop'а. Его же мы можем получить методом интерфейса объекта d3d GetAdapterDisplayMode(), указав в качестве первого параметра D3DADAPTER_DEFAULT.
Итак, мы можем уже написать функцию инициализации Direct3D для последующего просчёта объектов:
Читать дальшеИнтервал:
Закладка: