Здавалка
Главная | Обратная связь

Инициализация DirectX:InitDevice



Итак, продолжаем наполнять наше приложение новым кодом. Теперь нужно инициализировать собственно DirectX, так чтобы в нашем окне вообще что-то отображалось. Сечас нам предстоит сделать InitDevice. Хорошая новость заключается в том, что ранее мы просто сделали окно, а вот дальнейший код приведет к тому, что включится ваш видео ускоритель.

Начнем рассмотрение функции InitDevice. Прежде чем получить доступ к корневому объекту ID3D11Device– Direct3D устройству, а также к второму корневому объекту ID3D11DeviceContext – Direct3D контексту, разберемся вообще вархитектуреDirect3D версии 11. В этой версии рисование при вызове функций ID3D11DeviceContext::Draw осуществляется не куда-то, что задано по умолчанию – то есть на экран или в окно, — в версии DirectX11 нужно прежде всего задать куда именно
выполнять рисование. Вы можете догадаться, что рендер осуществляться может на различные поверхности, не обязательно на экран. Так что, нам нужно указать Direct3D на рендер-таргетRenderTarget – то есть куда рисовать – а также указать как это потом «перелистывать» — то есть осуществлять замену старого кадра новым при помощи цепочки-обмена IDXGISwapChain. На этом рисунке показывается то какие объекты используются Direct3D11 для вывода на экран:

Итак, при инициализации устройства Direct3D11 мы должны сделать несколько операций: создать объект g_pd3dDevice, создать объект g_pImmediateContext, создать рендер-таргетg_pRenderTargetView, указать 3d устройству что именно этот рендер-таргет используется для рисования в него любых примитив, а также создать объект «копировалку» g_pSwapChain с рендер-таргета на окно, то есть на экран. В последующем в программе мы уже не будем для рисования обращаться к рендер-таргету, для рисования будем использовать только ID3D11DeviceContext::Draw и затем отображать на экране при помощи g_pSwapChain::Present. Итак, создадим главные объекты, устройство и контекст:

DXGI_SWAP_CHAIN_DESC sd;ZeroMemory( &amp;sd, sizeof( sd ) );sd.BufferCount = 1;sd.BufferDesc.Width = width;sd.BufferDesc.Height = height;sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;sd.BufferDesc.RefreshRate.Numerator = 60;sd.BufferDesc.RefreshRate.Denominator = 1;sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;sd.OutputWindow = g_hWnd;sd.SampleDesc.Count = 1;sd.SampleDesc.Quality = 0;sd.Windowed = TRUE; for( UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++ ){g_driverType = driverTypes[driverTypeIndex];hr = D3D11CreateDeviceAndSwapChain( NULL, g_driverType, NULL, createDeviceFlags, featureLevels, numFeatureLevels,D3D11_SDK_VERSION, &amp;sd, &amp;g_pSwapChain, &amp;g_pd3dDevice, &amp;g_featureLevel, &amp;g_pImmediateContext );}

Обратите внимание, что при создании объекта функцией D3D11CreateDeviceAndSwapChain также автоматически создается контекст и цепочка обмена. Обратите внимание на объект g_pImmediateContext, данный объект имеет очень важно значение, так как многие методы перенесены в него, так что вы будете часто в приложении обращаться к этому объекту для выполнения тех или иных действий Direct3D. Также обратите внимание на обширное количество параметров структуры sd. Эти параметры, как нетрудно догадаться, и есть параметры инициализации адаптера и Direct3D – то есть, формат пикселей, геометрические размеры окна, частота кадров и т.п. Вообще, в структуре DXGI_SWAP_CHAIN_DESC еще больше параметров, и возможно, какие-то вам пригодятся для того чтобы устанавливать различные режимы отображения и работы DirectX. В более ранних версиях DirectX также были многочисленные параметры, используемые при инициализации Direct3D устройства. Итак, мы создали главный объект, контекст и цепочку обмена, осталось только создать рендер-тергет и указать DirectX, что он предназначен для рисования. Создаем рендер-таргет:

// Создание рендер-таргетаID3D11Texture2D* pBackBuffer = NULL;hr = g_pSwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), ( LPVOID* )&amp;pBackBuffer ); hr = g_pd3dDevice->CreateRenderTargetView( pBackBuffer, NULL, &amp;g_pRenderTargetView );pBackBuffer->Release();

Указываем Direct3D, что этот рендер-таргет надо использовать по умолчанию и что именно в него и надо всё рисовать:

g_pImmediateContext->OMSetRenderTargets( 1, &amp;g_pRenderTargetView, 0 );

Теперь настало время узнать о самом интересном, как собственно рисовать, то есть разберем функцию Render. А потом посмотрим на то, как перехватывать сообщения от клавиатуры, чтобы мы имели возможность управления нашим приложением, и главное, монстрами.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.