1

我一直在尝试编写一个程序,它使用 Allegro 5 来处理 2D 渲染和使用 Ogre 来处理 3D 渲染,但是我在初始化时遇到了问题,我已经解决了大部分问题,即窗口的 hInstance,但是现在的问题是,它只采用 Ogre 的类型,并且根据 Ogre API 参考Ogre::D3D9RenderWindow::setDevice()由 an 设置,而不是返回的是. 我需要帮助来弄清楚如何将.ID3Device9al_get_d3d9_device()LPDIRECT3DDEVICE9LPDIRECT3DDEVICE9ID3Device9

这是我到目前为止的代码:

#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;
}
4

2 回答 2

1

如果您使用 OpenGL,这是可能的。Allegro 有一个例子

不确定D3D。

于 2013-03-01T06:21:19.480 回答
0

在马修的回答的帮助下,经过大量的工作和繁琐的学习,我能够通过指针上的一些指针找到问题的解决方案。

这是最终代码:

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;
}
于 2013-03-02T00:05:30.380 回答