Уроки Коммент.

Создание игр » DirectX 9, Featured » Рендеринг в DirectX

Рендеринг в DirectX

Рендеринг в DirectXRendering, в переводе обозначает “визуализация”, но я обычно говорю просто рендеринг. В этом уроке мы поговорим об отрисовке примитивов в 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); // копируем на экран

Вот что у нас в итоге получилось:
Рендеринг в DirectX Надеюсь, как это работает понятно из кода и комментариев. Если же нет – пишите, постараюсь объяснить ещё более подробно.

Вы можете скачать проект с исходным кодом к этому уроку.

В следующем уроке мы опять немного поговорим о теории, но, на этот раз тема будет более интересная – нам предстоит разобраться что такое шейдер (shader) и с чем его едят.

Ещё по этой теме:




Раздел: DirectX 9, Featured · Теги: DirectX

26 комментариев на "Рендеринг в DirectX"
  1. PSM пишет:

    Надеюсь в продвинутой версии урока, в качества примера рендера будет монстр из первой картинки :)

  2. Вячеслав пишет:

    Со временем всё будет )

  3. Jast пишет:

    Спс, неплохой урок!

  4. dr пишет:

    Здравствуйте, Вячеслав!
    Спасибо за отличный блог!
    У меня проблемка. Экзешник из проекта с исходниками к уроку открывается и тут же закрывается.
    В чем может быть дело?

    1. Вячеслав пишет:

      Спасибо и Вам!

      Попробуйте запустить в режиме отладки – так проще всего будет найти ошибку. Если приложение закрывается ничего не говоря – возможно, оно просто не смогло инициализировать DirectX или загрузить какие-то нужные ресурсы – это всё можно очень просто отследить через debug.

      Если в режиме отладки ничего найти не удастся – напишите мне, буду более тщательно искать причину и потом напишу решение.

    2. lena пишет:

      У меня тоже была та-же проблемка, выход такой (в отдельную папку скопируйте файл ехе, папку DATA с содержимым и файлы с расширением hlsl).

  5. dr пишет:

    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).

  6. dr пишет:

    Причем похожие простые примеры из DirectxSDK и codesamplers.com запускаются нормально на этом ноуте.

    1. Вячеслав пишет:

      dr, простите, я верно понял, что Вы вообще не программируете? Если это так – думаю, искать ошибку бесполезно, Вы её не найдёте при всём желании, если только случайно.

  7. TWN пишет:

    Здравствуйте,такую ошибку выдаёт даже в исходном коде.
    1>Tutorial-02.obj : error LNK2019: ссылка на неразрешенный внешний символ _Direct3DCreate9@4 в функции “int __cdecl InitD3D(struct HWND__ *,int,int)” (?InitD3D@@YAHPAUHWND__@@HH@Z)

    1. Вячеслав пишет:

      Скорее всего Вы забыли подключить библиотеку Direct3D: d3d9.lib – добавьте её в список библиотек линковки.

      1. TWN пишет:

        Нет,всё подключенно.

        1. Вячеслав пишет:

          Символ _Direct3DCreate9@4 определён в файле d3d9.lib – возможно, Вы что-то напутали. Если же точно нет – я пока не могу предложить в чём ещё может быть проблема…

          1. TWN пишет:

            Эврика! У меня не установлен интерплитатор для .lib файлов. Не подскажите ссылку на него?

            1. Вячеслав пишет:

              Что за чушь Вы пишете? ;-)

  8. TWN пишет:

    Что вам конкретно непонятно?

    1. Вячеслав пишет:

      Конкретно непонятно зачем вам некий “интерплитатор для .lib файлов”, что это вообще такое, зачем он нужен и откуда я должен взять ссылку на него.
      Всё, что необходимо для компиляции и линковки программ входит в комплект Visual Studio, докачивать некие “интерплитаторы” нет никакой необходимости.

      1. TWN пишет:

        Странно… У меня компилятор пишет что “”Нет редактора для C:\Program Files (x86)\Microsoft DirectX SDK (June 2010)\Lib\x64\d3d9.lib”
        Убедитесь,что установленно приложение для типа файлов “.lib””

        1. Вячеслав пишет:

          Ничего странного. Редактировать lib-файлы и в самом деле совершенно незачем. Даже не представляю, зачем Вы пытаетесь это сделать. Думаю, Вам стоит почитать хотя бы общую информацию о С++, о процессе компиляции программ, о том, что такое библиотеки и так далее. И уже только после этого стоит приступать к изучению программирования.

  9. Michael пишет:

    дравствуйте, не подскажите в чём ошибка :
    Необработанное исключение в “0x00091766″ в “DirectX.exe”: 0xC0000005: Нарушение прав доступа при чтении “0x00000000″.

    1. Вячеслав пишет:

      Что-то происходит не так ) Попробуйте заняться отладкой приложения – ошибка должна быстро найтись.

    2. Сергей пишет:

      Видимо Вы пытаетесь отобразить то, что уже удалили или удалить то, что уже было удалено. Посмотрите вызовы деструкторов, не написана ли Вами функция освобождения ресурсов, может быть она вызывается дважды. Еще один момент может произойти, сама программа освобождает ресурсы по окончанию ее работы, поэтому стоит просмотреть вызов тех самых функций по освобождению ресурсов, возможно они вызываются пару или более раз.

  10. Sanec пишет:

    Блин, я уже думал что мы здесь будем модель этого монстра рисовать(

  11. RaMun пишет:

    отличный урок! Закончив его осознание у меня возникло желание подбросить дров в очаг образного мышления о том как машина командуется, если кому то с переводом понятнее и проще понимать, прошу ваше внимание:

    Vert-перейти в “другое”
    STENCIL-трафарет (присп. для нанесения большого кол-ва символов на поверхность)
    BUFFER-буфер
    Clear-очистить
    Diffuse-диффундировать (смешиванием путём диффузии-взаимное проникновение с обеих сторон, рассеивание, взаимодействие)
    Set-установка
    Device-устройство
    TRIANGLE-треугольник
    LIST-список
    Draw-рисовать
    Primitive-примитивный (вспоминаем начало урока)
    NULL-нуль, ноль
    Scene-сцена, акт действия

  12. Ветер пишет:

    Спасибо большое за простые и понятные уроки.
    Вот еще пояснить бы в статье что такое “вертекс” :)

  13. Станислав пишет:

    Предлагаю добавить немного интерактивности:
    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-х других вершин???
    Вячеслав, прошу не давать подсказки в этом уроке )

Оставить комментарий

*

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>