Создание игр » DirectX 9, Featured » Рендеринг в DirectX
Рендеринг в DirectX
Rendering, в переводе обозначает “визуализация”, но я обычно говорю просто рендеринг. В этом уроке мы поговорим об отрисовке примитивов в DirectX и научимся выводить на экран простейшие элементы – треугольники. Ведь именно из них практически во всех играх, от самых простых, до топовых формируется конечная картинка.
Всё в играх, начиная от интерфейса, и заканчивая облаками, растительностью, персонажами, взрывами и прочими эффектами, на самом деле представлено и ренедрится треугольниками. А для того, что бы эти треугольники были “больше похожи на правду” на них натянуты картинки, которые в компьютерной графике называются текстурами.
Итак, как же рисуются эти самые треугольники? На самом деле, это вовсе не сложно. В простейшем виде, это можно сделать с помощью всего вызова буквальный пары-тройки функций рендера DirectX:
// структура для хранения позиции и цвета вертекса struct VertPosDiffuse { D3DXVECTOR4 m_pos; D3DCOLOR m_color; VertPosDiffuse(D3DXVECTOR4 pos, D3DCOLOR color) : m_pos(pos), m_color(color) {} }; // три разноцветных вертекса = треугольник VertPosDiffuse v[] = { VertPosDiffuse(D3DXVECTOR4( 0, 0, 0, 1), D3DCOLOR_XRGB(255, 0, 0)), VertPosDiffuse(D3DXVECTOR4(400, 0, 0, 1), D3DCOLOR_XRGB(0, 0, 255)), VertPosDiffuse(D3DXVECTOR4(400, 400, 0, 1), D3DCOLOR_XRGB(0, 255, 0)) }; m_pd3dDevice->BeginScene(); // начинаем рисовать m_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_STENCIL| D3DCLEAR_ZBUFFER, 0x808080, 0, 0); // очистка экрана // указываем формат данных m_pd3dDevice->SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE); // рендерим треугольник m_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1/* 1 треугольник */, v /* данные брать отсюда*/, sizeof(VertPosDiffuse)/*размер вертекса*/); m_pd3dDevice->EndScene(); // закончили рендеринг сцены m_pd3dDevice->Present(NULL, NULL, NULL, NULL); // копируем на экран |
Вот что у нас в итоге получилось:
Надеюсь, как это работает понятно из кода и комментариев. Если же нет – пишите, постараюсь объяснить ещё более подробно.
Вы можете скачать проект с исходным кодом к этому уроку.
В следующем уроке мы опять немного поговорим о теории, но, на этот раз тема будет более интересная – нам предстоит разобраться что такое шейдер (shader) и с чем его едят.
Надеюсь в продвинутой версии урока, в качества примера рендера будет монстр из первой картинки
Со временем всё будет )
Спс, неплохой урок!
Здравствуйте, Вячеслав!
Спасибо за отличный блог!
У меня проблемка. Экзешник из проекта с исходниками к уроку открывается и тут же закрывается.
В чем может быть дело?
Спасибо и Вам!
Попробуйте запустить в режиме отладки – так проще всего будет найти ошибку. Если приложение закрывается ничего не говоря – возможно, оно просто не смогло инициализировать DirectX или загрузить какие-то нужные ресурсы – это всё можно очень просто отследить через debug.
Если в режиме отладки ничего найти не удастся – напишите мне, буду более тщательно искать причину и потом напишу решение.
У меня тоже была та-же проблемка, выход такой (в отдельную папку скопируйте файл ехе, папку DATA с содержимым и файлы с расширением hlsl).
Output в режиме Debug пишет следующее:
‘Tutorial-02.exe': Loaded ‘C:\Documents and Settings\dr\Мои документы\Visual Studio 2008\Projects\dev.mindillusion.ru\Tutorial-02\Debug\Tutorial-02.exe’, Symbols loaded.
‘Tutorial-02.exe': Loaded ‘C:\WINDOWS\system32\ntdll.dll’
‘Tutorial-02.exe': Loaded ‘C:\WINDOWS\system32\kernel32.dll’
‘Tutorial-02.exe': Loaded ‘C:\WINDOWS\system32\user32.dll’
‘Tutorial-02.exe': Loaded ‘C:\WINDOWS\system32\gdi32.dll’
‘Tutorial-02.exe': Loaded ‘C:\WINDOWS\WinSxS\x86_Microsoft.VC90.DebugCRT_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_597c3456\msvcr90d.dll’, Symbols loaded.
‘Tutorial-02.exe': Loaded ‘C:\WINDOWS\system32\d3d9.dll’
‘Tutorial-02.exe': Loaded ‘C:\WINDOWS\system32\d3d8thk.dll’
‘Tutorial-02.exe': Loaded ‘C:\WINDOWS\system32\msvcrt.dll’
‘Tutorial-02.exe': Loaded ‘C:\WINDOWS\system32\advapi32.dll’
‘Tutorial-02.exe': Loaded ‘C:\WINDOWS\system32\rpcrt4.dll’
‘Tutorial-02.exe': Loaded ‘C:\WINDOWS\system32\secur32.dll’
‘Tutorial-02.exe': Loaded ‘C:\WINDOWS\system32\version.dll’
‘Tutorial-02.exe': Loaded ‘C:\WINDOWS\system32\winmm.dll’
‘Tutorial-02.exe': Loaded ‘C:\WINDOWS\system32\serwvdrv.dll’
‘Tutorial-02.exe': Loaded ‘C:\WINDOWS\system32\umdmxfrm.dll’
The program ‘[1864] Tutorial-02.exe: Native’ has exited with code 0 (0x0).
Причем похожие простые примеры из DirectxSDK и codesamplers.com запускаются нормально на этом ноуте.
dr, простите, я верно понял, что Вы вообще не программируете? Если это так – думаю, искать ошибку бесполезно, Вы её не найдёте при всём желании, если только случайно.
Здравствуйте,такую ошибку выдаёт даже в исходном коде.
1>Tutorial-02.obj : error LNK2019: ссылка на неразрешенный внешний символ _Direct3DCreate9@4 в функции “int __cdecl InitD3D(struct HWND__ *,int,int)” (?InitD3D@@YAHPAUHWND__@@HH@Z)
Скорее всего Вы забыли подключить библиотеку Direct3D: d3d9.lib – добавьте её в список библиотек линковки.
Нет,всё подключенно.
Символ _Direct3DCreate9@4 определён в файле d3d9.lib – возможно, Вы что-то напутали. Если же точно нет – я пока не могу предложить в чём ещё может быть проблема…
Эврика! У меня не установлен интерплитатор для .lib файлов. Не подскажите ссылку на него?
Что за чушь Вы пишете?
Что вам конкретно непонятно?
Конкретно непонятно зачем вам некий “интерплитатор для .lib файлов”, что это вообще такое, зачем он нужен и откуда я должен взять ссылку на него.
Всё, что необходимо для компиляции и линковки программ входит в комплект Visual Studio, докачивать некие “интерплитаторы” нет никакой необходимости.
Странно… У меня компилятор пишет что “”Нет редактора для C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x64\d3d9.lib”
Убедитесь,что установленно приложение для типа файлов “.lib””
Ничего странного. Редактировать lib-файлы и в самом деле совершенно незачем. Даже не представляю, зачем Вы пытаетесь это сделать. Думаю, Вам стоит почитать хотя бы общую информацию о С++, о процессе компиляции программ, о том, что такое библиотеки и так далее. И уже только после этого стоит приступать к изучению программирования.
дравствуйте, не подскажите в чём ошибка :
Необработанное исключение в “0x00091766″ в “DirectX.exe”: 0xC0000005: Нарушение прав доступа при чтении “0x00000000″.
Что-то происходит не так ) Попробуйте заняться отладкой приложения – ошибка должна быстро найтись.
Видимо Вы пытаетесь отобразить то, что уже удалили или удалить то, что уже было удалено. Посмотрите вызовы деструкторов, не написана ли Вами функция освобождения ресурсов, может быть она вызывается дважды. Еще один момент может произойти, сама программа освобождает ресурсы по окончанию ее работы, поэтому стоит просмотреть вызов тех самых функций по освобождению ресурсов, возможно они вызываются пару или более раз.
Блин, я уже думал что мы здесь будем модель этого монстра рисовать(
отличный урок! Закончив его осознание у меня возникло желание подбросить дров в очаг образного мышления о том как машина командуется, если кому то с переводом понятнее и проще понимать, прошу ваше внимание:
Vert-перейти в “другое”
STENCIL-трафарет (присп. для нанесения большого кол-ва символов на поверхность)
BUFFER-буфер
Clear-очистить
Diffuse-диффундировать (смешиванием путём диффузии-взаимное проникновение с обеих сторон, рассеивание, взаимодействие)
Set-установка
Device-устройство
TRIANGLE-треугольник
LIST-список
Draw-рисовать
Primitive-примитивный (вспоминаем начало урока)
NULL-нуль, ноль
Scene-сцена, акт действия
Спасибо большое за простые и понятные уроки.
Вот еще пояснить бы в статье что такое “вертекс”
Предлагаю добавить немного интерактивности:
1. Добавляем глобальную переменную: POINT MousePos;
2. Добавляем обработчик события: WM_MOUSEMOVE
3. В обработчике перемещения мыши используем функцию: GetCursorPos(&MousePos);
4. Тут-же добавляем: v[0]=VertPosDiffuse(D3DXVECTOR4(MousePos.x,MousePos.y, 0, 1), D3DCOLOR_XRGB(255, 0, 0));
Ну а дальше задаемся вопросами типа: Почему координаты мыши не совпадают с вершиной треугольника???
Какие координаты возвращает функция getCursorPos(…)???
Почему треугольник виден только слева от 2-х других вершин???
Вячеслав, прошу не давать подсказки в этом уроке )