Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не удается создать 3D устройство. 
V
    Опции темы
Vermaxt
Дата 24.4.2010, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 4.8.2007

Репутация: нет
Всего: нет



Доброе.
Код

#include <d3d9.h>
#include <windows.h>

LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pDevice = NULL;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

HRESULT Direct3DInit()
{
    if(NULL == (g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

    return S_OK;
}

HRESULT GameInit(HWND hWnd)
{
    if ( FAILED(Direct3DInit() ) )
        return E_FAIL;
    
    if ( FAILED( Direct3DInit() ) )
        return E_FAIL;
    
    D3DDISPLAYMODE currentDisplay;
    
    if ( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &currentDisplay ) ) )
        return E_FAIL;    

    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof( D3DPRESENT_PARAMETERS ));

    if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pDevice)))
        return E_FAIL;

    return S_OK;
}

HRESULT ShutDown(void)
{
    if (g_pDevice)
    {
        g_pDevice->Release();
        g_pDevice = NULL;
    }

    if (g_pD3D)
    {
        g_pD3D->Release();
        g_pD3D = NULL;
    }
    
    return S_OK;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLime, int iWndShow)
{

    WNDCLASSEX wndClass;
    wndClass.cbClsExtra = 0;
    wndClass.cbSize = sizeof(WNDCLASSEX);
    wndClass.cbWndExtra = 0;
    wndClass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
    wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
    wndClass.hInstance = hInstance;
    wndClass.lpfnWndProc = WndProc;
    wndClass.lpszClassName = "GameWindow";
    wndClass.lpszMenuName = NULL;
    wndClass.style = CS_VREDRAW | CS_HREDRAW;
    
    RegisterClassEx(&wndClass);

    HWND hWnd = CreateWindow( "GameWindow", "Ìàäæîíã", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

    ShowWindow(hWnd, iWndShow);

    MSG msg;

    if ( FAILED(GameInit(hWnd) ) )
        return 0;
    
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    ShutDown();
    
    return 0;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    switch(iMsg){
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }

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


Приложение запускается и сразу закрывается. Подскажите почему? Думаю здесь какая-нибудь очевидная ошибка просто мой недельный опыт не позволяет ее обнаружить)
PM MAIL   Вверх
Alexeis
Дата 24.4.2010, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



Цитата(Vermaxt @  24.4.2010,  10:55 Найти цитируемый пост)
мой недельный опыт не позволяет ее обнаружить)

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Vermaxt
Дата 24.4.2010, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 4.8.2007

Репутация: нет
Всего: нет



Alexeis, 
Код

g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pDevice)


Возвращает E_FAIL. Только не могу в дебаге увидеть код ошибки. Почему то не пишет. Подскажите как посмотреть код ошибки?
PM MAIL   Вверх
Vermaxt
Дата 24.4.2010, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 4.8.2007

Репутация: нет
Всего: нет



Вроде как выяснил код ошибки 0x8876086c поискал ничего не нашел. Может кто знает?
PM MAIL   Вверх
Alexeis
Дата 24.4.2010, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



Vermaxt, на самом деле E_FAIL возвращает строчка 
Код

    if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pDevice)))
        return E_FAIL;

Сама же функция CreateDevice возвращает одно из значений D3DERR_DEVICELOST, D3DERR_INVALIDCALL, D3DERR_NOTAVAILABLE, D3DERR_OUTOFVIDEOMEMORY.
Чтобы об этом узнать сохраните значение, которое возвращает функция вместо простой передачи в макрос FAILED()

Добавлено через 2 минуты и 26 секунд
Можно попробовать заменить флаг на D3DCREATE_SOFTWARE_VERTEXPROCESSING для отключения аппаратного ускорения (может дело в драйверах).


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Vermaxt
Дата 24.4.2010, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 4.8.2007

Репутация: нет
Всего: нет



Alexeis, Нет, я это понимаю. Я имел ввиду что возвращаемое значение функции CreateDevice являлось причиной возврата в WinMain значения E_FAIL и как следствие возврата в операционную систему. Нет с драйверами все впорядке. 0x8876086c код который возвращает CreateDevice. Гуглил, ничего не нагуглил.
Для полноты изложения:
user posted image

Это сообщение отредактировал(а) Vermaxt - 24.4.2010, 19:43
PM MAIL   Вверх
Alexeis
Дата 25.4.2010, 00:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 5
Всего: 459



В технологии COM результат возвращается следующим образом. 
старший бит - код серьезности ошибки. Именно он определяет состояние ошибки E_FAIL это или нет.
биты 16-26 означают код устройства. И только 2 младших байта это настоящий код ошибки.
Смотрим константы 
Полный код ошибки 0x8876086c

D3DERR_DEVICELOST - 0x0868 не подходит
D3DERR_INVALIDCALL - 0x086C о! оно подошло 

На самом деле чтобы такой фигней не заниматься (не вытаскивать код из результата), просто применяем специально созданный для таких случаев макрос HRESULT_CODE(hr). Например
Код

  if (HRESULT_CODE(hr) == D3DERR_INVALIDCALL) в нашем случае сработает


Похоже что D3DPRESENT_PARAMETERS настроена неверно

Цитата

The following steps represent the general approach to getting Direct3D up and running:
   1. Create an instance of a Direct3D9 interface object with a call to Direct3DCreate9.
   2. Use GetAdapterDisplayMode to retrieve the video adapter’s current display mode.
   3. Check hardware support issues on items such as maximum z-buffer depth by calling CheckDeviceFormat.
   4. Call GetDeviceCaps to probe the video card for hardware acceleration and adjust accordingly by creating a combination of one or more behavior flags.
   5. Create a D3DPRESENT_PARAMETERS structure and set its members to reflect our application’s rendering needs (i.e. color resolution, z-buffer depth, double-buffering).
   6. Use the CreateDevice method of your Direct3D9 object to create an instance of an IDirect3DDevice9 interface object by passing in your D3DPRESENT_PARAMETERS structure and a DWORD variable representing our behavior flags.


Можно посмотреть пример инициализации здесь http://www.codesampler.com/d3dbook/chapter_04/chapter_04.htm



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Vermaxt
Дата 25.4.2010, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 4.8.2007

Репутация: нет
Всего: нет



Alexeis, Спасибо разобрался. Все работает!

Это сообщение отредактировал(а) Vermaxt - 25.4.2010, 08:26
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.