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

Создание игр » DirectX 9, Featured » CreateDevice. Создаём первое приложение.

CreateDevice. Создаём первое приложение.

CreateDeviceCreateDevice создаёт контекст (девайс) Direct3D. В случае успешного вызова CreateDevice, устройство будет создано и после этого можно загружать текстуры, шейдеры, модели, производить рендеринг и т.д. Давайте сделаем наше первое приложение под DirectX 9. Для начала создадим стандартное приложение win32. Любое (оконное) приложение Windows должно обрабатывать системные сообщения и созданное нами приложение именно так и будет делать. Но нам бы хотелось, что бы в моменты, когда приложению нечего обрабатывать (нет системных сообщений), всё своё свободное время оно посвящало рендеру. Немного модифицируем код основного цикла приложения:

// Main message loop:
MSG msg;
ZeroMemory(&msg, sizeof(MSG));
while( msg.message!=WM_QUIT ) // если не сообщение о выходе
{
	// проверяем, есть ли сообщения в очереди
	if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
	{
		// сообщения есть, обрабатываем их
		TranslateMessage( &msg );
		DispatchMessage( &msg );
	}
	else // иначе занимаемся рендером
	{
		// тут будет код рендера
		// а пока просто очистка экрана
		m_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_STENCIL|
			D3DCLEAR_ZBUFFER, 0, 0, 0);
		m_pd3dDevice->Present(NULL, NULL, NULL, NULL);
	}
}

CreateDevice

Теперь нужно создать 3д-девайс, с помощью которого, собственно, и будет происходить рендер в приложении. Первым делом, необходимо подключить заголовки и библиотеки DirectX:

#include <d3d9.h>
#include <d3dx9.h>
 
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")

и инициализировать сам DirectX:

LPDIRECT3D9 m_pD3D = Direct3DCreate9( D3D_SDK_VERSION );

Для создания самого Direct3DDevice необходимо использовать функцию CreateDevice:

HRESULT CreateDevice(
  [in]           UINT адаптер/*обычно D3DADAPTER_DEFAULT*/,
  [in]           D3DDEVTYPE тип_девайса/*обычно D3DDEVTYPE_HAL*/,
  [in]           HWND хэнд_окна_приложения/*передаём HWND нашего окна*/,
  [in]           DWORD доп_флаги/*обычно D3DCREATE_HARDWARE_VERTEXPROCESSING*/,
  [in, out]      D3DPRESENT_PARAMETERS *параметры,
  [out, retval]  IDirect3DDevice9 **девайс);

В итоге получится примерно вот так:

BOOL InitD3D(HWND hWnd, int iWindowWidth, int iWindowHeight)
{
	// сначала проицициализируем сам DirectX 9
	m_pD3D = Direct3DCreate9( D3D_SDK_VERSION );
	if (m_pD3D==NULL)
		return FALSE;
 
	// структкура с параметрами девайса
	D3DPRESENT_PARAMETERS d3dpp;
	ZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS)); // обнулим
	d3dpp.BackBufferWidth = iWindowWidth; // указываем ширину и
	d3dpp.BackBufferHeight = iWindowHeight; // высоту области рендера
	d3dpp.BackBufferCount = 1; // один внеэкранный буфер
	d3dpp.Windowed = TRUE; // рендер в окне, а не в полный экран
	d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; // формат выберет сам DX
	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // так лучше делать всегда
	d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; // формат Z-буфера
	d3dpp.EnableAutoDepthStencil = TRUE; // нам нужен Z-буфер
	d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
 
	// и теперь создадим сам девайс
	HRESULT hr = m_pD3D->CreateDevice( D3DADAPTER_DEFAULT,
		D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING,
		&d3dpp, &m_pd3dDevice );
 
	return !FAILED(hr);
}

Нам этом всё. Скачать проект со всеми исходниками.

Следующим уроком будет рассказ о векторах, матрицах и трансформациях.

»crosslinked«

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




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

28 комментариев на "CreateDevice. Создаём первое приложение."
  1. PSM пишет:

    Обычное “Hello World!” но:
    – видно что код лепился и кусков копипаста
    – комментарии то на английском то на русском. Надо определиться
    – LPDIRECT3D9 m_pD3D = NULL; m_ и глобальная? Будет статья про кодинг стайл?
    – уже 2011 но “машинки” еще не у всех поддерживают D3DCREATE_HARDWARE_VERTEXPROCESSING.
    Предлагаю добавить проверку:
    D3DCAPS9 caps;
    m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);

    int vp = 0;
    if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
    vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
    else
    vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
    Может еще кому-то кроме меня это поможет.

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

      На самом деле код я и в самом деле “скопипастил” с моего движка вот от этого:
      http://www.youtube.com/watch?v=ri2-qoZBSwM
      Однако, поддержку софтвара отключил сознательно – полагая, что такие видюхи остались лишь на некоторых нетбуках. Однако, на будущее, учту и введу необходимые проверки в код. Спасибо за ваш комментарий.

  2. Иван пишет:

    Парни, я D3DADAPTER_DEFAULT поменял на NULL и всё пока работает. Как думаете, никаких сбоев не будет?

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

      А зачем поменял-то?
      Вообще, D3DADAPTER_DEFAULT это дефайн, значение которого =0. Потому сбоев, естественно, не будет. Но код станет менее наглядным.

  3. Артем пишет:

    а мне можете хоть че тут обьяснить ото я воще не в курю че то(((

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

      Что именно непонятно?

  4. Stanz пишет:

    а где эта штука CreateDevice

  5. ferber пишет:

    А у меня компилятор е видит

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

    Stanz, я не понимаю смысла вашего вопроса.

    ferber, не видит? Не видит кого?

  7. Empire пишет:

    HELP! Компилятор пишет что m_pd3dDevice не инициализирован.

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

      Можете точно процитировать что именно он пишет? Сообщение о том, что переменная используется без инициализации или о том, что нет декларации переменной?

      Вы скачали код из аттача к уроку или писали его сами?

      1. Empire пишет:

        1.Идентификатор “m_pd3dDevice” не определён.
        2.Конечно писал сам(иначе какой в этом смысл).

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

          Смысл в том, что бы просто взять код и посмотреть, что не так, дабы можно было самостоятельно решить простые ошибки, вроде этой. Я же не говорю, что надо бездумно копировать код – но просто посмотреть-то ничего не мешает ;-)

          В данном случае проблема в том, что вы используете переменную, которую не декларировали ранее.

          Добавьте в код: LPDIRECT3DDEVICE9 m_pd3dDevice;
          и всё будет работать.

          1. Empire пишет:

            Пардон,у меня не большой опыт С++ программирования.

          2. Empire пишет:

            И кстати:
            IDirect3D9::CreateDevice: невозможно преобразовать параметр 6 из “int *” в “IDirect3DDevice9 **”

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

              См. выше – качайте исходный код в аттаче и разбирайтесь. Ошибки совершенно детские – полагаю, Вы просто вообще не понимаете того кода, который пишете.

  8. Михаил пишет:

    Я прошу прощения, НО!: что это всё такое? Где это всё набирать то надо??? Все эти программные коды где пишутся? В паскале что ли? Я конечно нуб чёрвствый, но у меня желания по горло начать этим заниматься!!! Объясните начало работы пошагово! Где писать? Что писать?

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

      Они пишутся (конкретно в моих примерах) в MS Visual Studio. Однако, если у Вас возникают такие вопросы, думаю, Вам стоило бы сначала изучить основы программирования на C++ и особенности использования конкретно Visual Studio, и уже только после этого браться за программирование игр и графики. В противном случае толку будет очень мало.

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

    Люди добрые, помогите пожалуйста, дайте ссылочки на обучение с нуля С++, желательно видео, а в прочем сойдет любой материал…
    Горю желанием обучиться, но не могу найти норм обучение.
    Зараннее благодарен

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

      Сергей, для обучения Вам необходимо понять основы программирования как вообще такового, если они есть, то изучайте синтаксис языка C++, книг для этого множество, статей тоже. Конкретно я уже знал до С++ язык Pascal и для изучения читал книгу Страуструпа. Поняв синтаксис и структуру программы, уже переходил к самому программированию. Еще было бы не плохо узнать как работает операционная система. Для понимания работы Вашей программы это было бы не плохо. Какую книгу почитать я не могу сказать, но в своем случае, я пользовался статьями. Более того, по моему, в приведенной мной книге это описано, если мне не изменяет память.
      Это если заниматься одному, а вообще лучше всего узнать все от преподавателя или от знакомого, который этим занимался, чтобы он объяснил для Вас понятным языком что, куда, для чего. Он же Вам и подскажет что почитать, какие у Вас минусы и плюсы. И самое главное, не унывайте! Это достаточно сложное дело, но когда вникните, то получите большой результат.

  10. Андрей пишет:

    ругается на отсутствие d3dx9, самостоятельно установить не получается( Что теперь завязывать?

    1. Андрей пишет:

      http://s019.radikal.ru/i623/1205/c5/55310dda5460.jpg ссылка на изображение W7 64 у меня

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

      А в чём проблема с установкой-то?
      Вы случайно не пытаетесь “руками” подпихнуть ему нужную DLL? Что бы всё работало нормально – необходимо установить DirectX SDK и тогда, по идее, проблем быть не должно.

  11. Jan пишет:

    Извините меня конечно, но статья суховата, ни слова о COM структуре DirectX, не пояснения параметров функций и структуры D3DPRESENT_PARAMETERS.

  12. Олег пишет:

    Здравствуйте!

    Благодарю за уроки, ресурсов аналогичных Вашему я не находил, а задача стоит именно в создании игрового приложения с использованием DirectX.

    Напишите, пожалуйста, подробную инструкцию по установке DirectX SDK и подключению его к проекту. Как я понял Вы работаете с DirectX9?

    Заранее спасибо.

  13. Евгений пишет:

    Помогите пожалуйста с созданием игры. Я знаю html и немного php. Если поможете, то я вк vk.com/ivallly/ .

  14. Yar пишет:

    Всё работает. Спс!

  15. Yar пишет:

    Мужики! если вы не знаете куда вводить код, но желание не пропадает…
    (и это хорошо и правильно), то посоветую всего одну книгу
    Фрэнк Д. Луна ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ ТРЕХМЕРНЫХ ИГР С DirectX 9.0
    Если внимательно прочитать хотябы первые 3 главы (на это у меня ушло 5-6 дней без особых напрягов ибо написано очень доступно без лирики и выкрцтасов), то эти уроки будете читать легко и с удовольствием, впитывая полезную информацию и не запинаясь на вопросах из серии как настроить среду. В книге прямо со введения подробнейшим образом описано как установить DirectX SDK (необходимые библиотеки) и настроить среду программирования. (ну а если всё же не поймёте – совместно справимся).
    Если нужны исходники к книге – пишите.

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

*

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