Вторник, 17.06.2025, 17:43
Приветствую Вас Гость | RSS
Меню сайта
fff
  • Индексация
  • Девочки
    Форма входа
    Категории раздела
    Теория алгоритмов [3]
    Теория алгоритмов
    Code Snippets [1]
    Code Snippets
    Все о PHP [20]
    Все о PHP
    Visual C++ [13]
    Visual C++
    WIN32 API [7]
    WIN32 API
    Delphi [72]
    Delphi
    ASP [2]
    ASP
    Java [67]
    Java
    VBScript [6]
    VBScript
    CGI [2]
    CGI
    VRML [2]
    VRML
    PERL [9]
    PERL
    HTML [4]
    HTML
    XML [10]
    XML
    Архив записей

    Статьи по Оптимизации

    ПРОГРАММИРОВАНИЕ! СОЗДАНИЕ САЙТОВ И ИХ ОПТИМИЗАЦИЯ

    Главная » Статьи » Программирование » Visual C++

    Direct3dX - Создание устройства
    Direct3dX - Создание устройства
    Пусть вы уже нашли где-то 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 );
    Window( 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.

    Категория: Visual C++ | Добавил: Merlin (07.12.2009)
    Просмотров: 455 | Рейтинг: 0.0/0
    Всего комментариев: 0
    Имя *:
    Email *:
    Код *: