Вход/Регистрация
DirectX 8. Начинаем работу с DirectX Graphics
вернуться

Поздняков Константин

Шрифт:

p_p.BackBufferFormat = dm.Format;

p_p.Windowed=TRUE;

p_p.SwapEffect=D3DSWAPEFFECT_DISCARD;

Последний шаг, который осуществляет наша функция Init — создание устройства. Для этого воспользуемся методом IDirect3D8::CreateDevice.

Укажем следующие параметры:

a. D3DADAPTER_DEFAULT — используется стандартный видеоадаптер

b. D3DDEVTYPE_REF — визуализация будет происходить исключительно программными средствами Direct3D

c. hWnd — собственно, идентификатор окна

d. D3DCREATE_SOFTWARE_VERTEXPROCESSING — обработка точек будет происходить исключительно программными средствами

e. &p_p — указатель на структуру, описывающую параметры создающегося устройства

f. &g_pd3dDevice — адрес указателя на интерфейс IDirect3DDevice8, который будет создан

Вот, что должно получиться:

g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &p_p,&g_pd3dDevice);

Функция Render

Эта функция как раз рендерит сцену. Принцип ее действия:

a. Очищается бэк-буфер, и в него рендерится сцена (итого, в бэк-буфере окажется темно-синий экран, т.к. сцена не содержит объектов)

b. Происходит передача данных во франт-буфер

c. Содержимое франт-буфера "выбрасывается" на экран

Очистить сцену можно вызвав метод IDirect3DDevice8::Clear. Его первые два параметра мы обнуляем, т.к. хотим очистить экран (на самом деле не экран, а рабочую область окна, но так проще писать :) ) целиком. Значение третьего параметра (D3DCLEAR_TARGET) говорит о том, что очистка должна происходить цветом, заданным четвертым параметром (в нашем случае D3DCOLOR_XRGB(30, 60, 120)). Последние два параметра в нашем случае игнорируются. Поэтому, пишем:

g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(30, 60, 120), 1.0f, 0);

Подготовка завершена, переходим к рендерингу в бэк-буфер:

g_pd3dDevice->BeginScene;

g_pd3dDevice->EndScene;

Методы IDirect3DDevice8::BeginScene и IDirect3DDevice8::EndScene показывают, в каком месте начинается, а в каком заканчивается процесс рендеринга. Все методы рендеринга, вызванные вне зоны ограниченной данными операторами, игнорируются.

Последний шаг - передача видеоданных на экран через франт-буфер. Это осуществляется с помощью метода IDirect3DDevice8::Present.

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

Первые два параметра задают прямоугольные области источника (бэк-буфера) и места назначения (франт-буфера), поскольку копируется целиком вся область, то эти параметры выставлены в ноль. Третий параметр - указатель на принимающее окно, в клиентскую часть которого происходит выполнение метода Present. Поскольку мы используем структуру D3DPRESENT_PARAMETERS, то третий параметр выставляем в NULL. Четвертый параметр — никогда не используется, его всегда нужно выставлять в NULL :-)

Функция Sweep

Самая короткая по программному коду функция. Осуществляет "подчистку" после нашей работы.

g_pd3dDevice->Release;

g_pD3D->Release;

UnregisterClass("InitClass", wclass.hInstance);

Все просто. Сначала освобождаем устройства рендеринга, затем объект D3D. После этого остается лишь удалить класс окна и все!

Функция MessageProc

Стандартная функция всех Windows приложений (название функции может быть любым), которая обрабатывает поступившие окну сообщения.

switch (msg) {

case WM_DESTROY:

 Sweep;

 PostQuitMessage(0);

 break;

case WM_PAINT:

 Render;

 ValidateRect(hWnd, NULL);

 break;

default:

 return DefWindowProc(hWnd, msg, wParam, lParam);

 break;

}
 

Если окну поступает сообщение WM_DESTROY, то происходит "подчистка" функцией Sweep, а обращение к функции PostQuitMessage(0) говорит системе, что наше приложение завершило работу. Если же окну поступило сообщение WM_PAINT (например, когда пользователь передвинул окно мышкой), то все окно должно быть немедленно перерисовано, что и делает наша функция Render. Остальные сообщения обрабатываются стандартным образом. Как мне приятно описывать эту функцию :-) И не потому, что она последняя в данной статье. Просто в ней все красиво, т.к. ранее мы подготовили базу для ее работы.

Ну, вот и все. Надеюсь, что ты почерпал из этой статьи для себя что-то новое и интересное… Не пугайся, если программа показалась тебе слишком большой и сложной. Это не значит, что для рисования треугольника придется добавлять к ней такой же большой кусок кода. Просто дописать пару десятков строчек кода и делов-то :-) Ты сделал самый сложный шаг — первый. Теперь будет легче. Позже будем учиться отрисовывать трехмерные объекты, научимся использовать матрицы трансформации, устанавливать источники света, накладывать текстуры… Но об этом уже в следующих статьях…

  • Читать дальше
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: