Конфликт устройств Ogre и Allegro direct3d 9

Я пытался написать программу, которая использует Allegro 5 для обработки 2D-рендеринга и Ogre для 3D-рендеринга, но у меня были проблемы с инициализацией, у меня было большинство проблем, которые были hInstance окна, но теперь проблема в том, что Ogre::D3D9RenderWindow::setDevice() принимает только тип Ogre, который устанавливается ID3Device9 в соответствии со ссылкой на Ogre API, а не тем, что возвращает al_get_d3d9_device(), который является LPDIRECT3DDEVICE9. Мне нужна помощь, чтобы понять, как преобразовать LPDIRECT3DDEVICE9 в ID3Device9.

Вот код, который у меня есть до сих пор:

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{

ALLEGRO_DISPLAY *al_display = NULL;

if(!al_init())
{
    fprintf(stderr, "Cannot initialize allegro");
    return -1;
}

al_display = al_create_display(640, 480);

if(!al_display)
{
    fprintf(stderr,"Cannot initialize the display");
    return -1;
}

HWND hWnd = al_get_win_window_handle(al_display);

HINSTANCE hInst = (HINSTANCE)GetWindowLong( hWnd, GWL_HINSTANCE);

Ogre::D3D9RenderWindow ogre_window(hInst);

ogre_window.setDevice(al_get_d3d_device(al_display)); // Function only takes an Ogre::D3D9Device

return 0;
}

person jason_rea    schedule 28.02.2013    source источник


Ответы (2)


Это возможно, если вы используете OpenGL. пример поставляется вместе с Allegro.

Насчет D3D не уверен.

person Matthew    schedule 01.03.2013

После большой работы и утомительного изучения с помощью ответа Мэтью я смог найти решение проблемы с помощью нескольких указателей на указатели.

Вот окончательный код:

int _tmain(int argc, _TCHAR* argv[])
{
ALLEGRO_DISPLAY *al_display = NULL;

if(!al_init())
{
    fprintf(stderr, "Cannot initialize allegro");
    return -1;
}

al_display = al_create_display(640, 480);

if(!al_display)
{
    fprintf(stderr,"Cannot initialize the display");
    return -1;
}

HWND hWnd = al_get_win_window_handle(al_display);

HINSTANCE hInst = (HINSTANCE)GetWindowLong( hWnd, GWL_HINSTANCE);

Ogre::D3D9RenderWindow ogre_window(hInst);

LPDIRECT3DDEVICE9 D3dDev = al_get_d3d_device(al_display);
IDirect3DDevice9 *iD3dDev = D3dDev;
Ogre::D3D9DeviceManager D3dDevManager;
Ogre::D3D9Device *OD3dDev = D3dDevManager.getDeviceFromD3D9Device(iD3dDev);
ogre_window.setDevice(OD3dDev);

return 0;
}
person jason_rea    schedule 02.03.2013