Навигация по сайту:
home
файлы
ссылки
уроки, примеры
форум




  Уроки, примеры


Урок 1

Создание устройства.
Пусть вы уже нашли где-то DirectX 8.1 и его SDK. Если вы хотите научиться сами создавать простейшее пустое приложение или в вашем SDK нет мастера создания, то вам сюда. Я предполагаю, что вы уже имеете опыт создания приложений для Windows без использования MFC. Если нет, то может быть вам следует посмотреть различные статьи по этой теме.
Итак. Создайте проект, присоедините к нему d3d8.lib (в настройках проекта), перейдите в его главный файл и найдите функцию WinMain. Добавьте в нее примерно это:

WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
    GetModuleHandle(NULL), NULL, NULL, NULL, NULL,"Lession", NULL };
RegisterClassEx( &wc );

HWND hWnd = CreateWindow( " Lession ", "Lession 1",
        WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
        GetDesktopWindow(), NULL, wc.hInstance, NULL );

Этот участок кода стандартен почти для всех Win32 прилжоений. После создания окна необходимо создать устройство Direct3D. Для этого создайте функцию, например, InitD3D(HWND hWnd). В нее включите следующий код:

g_pD3D = Direct3DCreate8( D3D_SDK_VERSION );

Перед этим лучше добавить LPDIRECT3D8 g_pD3D в начало програмы после #include. Функчия Direct3DCreate8() возвращает указатель на интерфейс IDirect3D8. Следующий шаг – получение доступного D3D устройства:

D3DDISPLAYMODE d3ddm;
g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm );

Дальше необходимо определить настройки вашего 3D приложения с помощью структуры D3DPRESENT_PARAMETERS:

D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE; // ваше приложение исполняется в окне
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = d3ddm.Format; // формат заднего буфера берется стандартным

Последний кусок кода в этой функции – завершение создание Direct3d устройства, создание устройства рендеринга. Поместите в начало файла определение LPDIRECT3DDEVICE8 g_pd3dDevice, а следующий код – в InitD3d().

g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
        &d3dpp, &g_pd3dDevice );

В этой функции параметр D3DDEVTYPE_HAL указывает на то, что используется аппаратное ускорение. hWnd характеризует текущее окно приложения. g_pd3dDevice – новое устройство рендеринга. D3DCREATE_SOFTWARE_VERTEXPROCESSING указывает на то, что используется программная обработка вершин. Если видеокарта поддерживает аппаратую обработку вершин, установите D3DCREATE_HARDWARE_VERTEXPROCESSING для увеличения производительности.
Следующий шаг – создание функции обработки системных сообщений. Опять же найдите функцию WinMain(), добавьте в нее во-первых вызов функции InitD3D и показ окна:

InitD3D( hWnd );
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );

А во-вторых нужно добавить код получения системных сообщений:

MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) )
{
    TranslateMessage( &msg );
    DispatchMessage( &msg );
}

Как только вы сделали это, можно создать функцию обработки сооющений:

LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:
            PostQuitMessage( 0 );
            return 0;

        case WM_PAINT:
            Render();
            ValidateRect( hWnd, NULL );
        return 0;
     }

return DefWindowProc( hWnd, msg, wParam, lParam );
}

Данная функция при получении сообщения о выходе завершает приложение, а при получении сообщения о перерисовке окна она выполняет функцию Render(), о которой будет рассказано ниже. Кстати, вместо WM_PAINT можно использовать WM_TIMER или что-нибудь еще.
Теперь самое гланое (почти) – функция рендеринга. Создайте функцию Render и добавьте в нее следующий код:

g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );

Эта функция очищает экран и заполняет его синим (в данном случае) цветом. После этого необходимо начать процедуру рендеринга:

g_pd3dDevice->BeginScene();

и закончить ее:

g_pd3dDevice->EndScene();

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

g_pd3dDevice->Present( NULL, NULL, NULL, NULL );

Теперь вам надо добавить в программу код, который будет отвечать за уничтожение всего того, что вы создали. Для этого найдите WinMain() и припишите перед return 0 следующее:

if(g_pd3dDevice != NULL)
    g_pd3dDevice->Release();
if( g_pD3D != NULL)
    g_pD3D->Release();

Вот вроде бы и все. После сборки приложения вы увидите синее окно. Это будет означать, что вы все сделали правильно. Но помните, что это очень нудный вариант создатия программы, т.к. есть очень легкий способ – AppWizard.

P.S.  Исходники примера здесь
урок 1
урок 2
урок 3
урок 4


Сайт создан в системе uCoz