DirectX 8. Начинаем работу с DirectX Graphics - страница 4

Шрифт
Интервал

стр.

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

Удачной тебе компиляции!

Примечание: Если будешь писать программу сам, помни, что для ее компиляции нужно подключить библиотечные файлы [*.lib]. Lib'ы подключайются так:

a. Project->Settings…

b. Открой вкладку "Link"

c. В строке "Object/library modules" добавь в начало d3d8.lib

d. Должно получиться примерно следующее: "d3d8.lib kernel32.lib user32.lib gdi32.lib…"

Автор: voxatu

DirectX 8: Создание и текстурирование простого трехмерного объекта

Автор: voxatu

Ты уже умеешь инициализировать Direct3D, а значит можно на этой базе создавать трехмерные объекты. Чтобы было совсем интересно, натянем на наш трехмерный объект текстуру и заставим его вращаться!!! Кроме того, воспользуемся фильтрацией текстур и MipMapping'ом, чтобы получить более реалистичный результат почти без потери быстродействия. Попутно, научимся работать со вспомогательной библиотекой Direct3DX. Пример можешь скачать ЗДЕСЬ.

Итак, приступим. За "трехмерный объект" возьмем правильную четырехугольную пирамиду, а за текстуру — подредактированную фотографию каменной стены (первоначальный вариант текстуры взят с сайта http://www.3dcafe.com/, на котором собрано огромное количество различных бесплатных для скачивания изображений).

Функции WinMain(), MessageProc() и InitD3D() будут очень похожи на аналогичные функции программы из предыдущей статьи, поэтому я буду объяснять, в основном, только модифицированные их части. Структура программы немного изменилась. Теперь более грамотно обрабатываются ошибки, которые могут возникнуть при выполнении той или иной части программы.

Рассмотренные функции исходника:

Функция WinMain()

Функция Initialization()

Функция InitD3D()

Функция InitTexture()

Функция InitScene

Функция DoMatrices()

Функция RenderScene()

Функция Deinitialization()

Функция MessageProc()

Функция WinMain()

Главная функция нашего приложения. Практически аналогична одноименной функции из предыдущей статьи. Единственное, что сильно изменилось — цикл обработки сообщений. Также, вынесены в отдельные функции инициализация и деинициализация приложения.

>if (Initialization(hWnd)) {

> ShowWindow(hWnd, nCmdShow);

> UpdateWindow(hWnd);

> MSG msg;

> ZeroMemory(&msg, sizeof(msg));

> while(msg.message != WM_QUIT) {

>  if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) {

>   TranslateMessage(&msg);

>   DispatchMessage(&msg);

>  } else RenderScene();

> }

>}

>Deinitialization();

Если инициализация проходит успешно, окно приложения отображается на экране и начинается цикл обработки сообщений, иначе деинициализация и выход из программы. Функция PeekMessage() проверяет очередь сообщений для текущей нити процесса и, если таковые имеются, помещает одно из них в структуру MSG. Флаг PM_REMOVE говорит о том, что сообщение из очереди удаляется, т.е. на нас возлагается ответственность его корректной обработки в любом случае. Это мы и делаем в следующих двух строчках. Если же очередь сообщений пуста, вызывается функция RenderScene(), которая, согласно ее названию, рендерит очередной кадр сцены. Как только поступает сообщение WM_QUIT, происходит деинициализация приложения (функция Deinitialization()).

Функция Initialization()

Осуществляет грамотную (т.е. с учетом ошибок) инициализацию D3D, текстур и сцены. Замечу, что все функции нашего приложения, в которых может возникнуть ошибка, имеют тип BOOL. Рассмотрим программный код:

>CurrentFilter = D3DTEXF_NONE;

>if (!InitD3D(hWnd)) return FALSE;

>if (!InitTexture()) {

> MessageBox(NULL, "Не найден файл текстуры!", "Ошибка", MB_ICONERROR);

> return FALSE;

>}

>if (!InitScene()) return FALSE;


стр.

Похожие книги