D3DXCreateTextureFromResource in DLL

利用D3DXCreateTextureFromResource可以从资源中创建纹理,但如果在dll中用的话,还要使用到GetModuleHandle(),把dll文件名传入GetModuleHandle后将得到的HMODULE值传入D3DXCreateTextureFromResource


http://hi.baidu.com/zhe8stianshi/blog/item/0187a61ee6fa27f11ad57648.html


D3DXCreateTextureFromResource使用注意!
HRESULT WINAPI D3DXCreateTextureFromResource(
    LPDIRECT3DDEVICE9 pDevice,
    HMODULE hSrcModule,
    LPCTSTR pSrcResource,
    LPDIRECT3DTEXTURE9 *ppTexture
);

1. 如果图是BMP格式, 可以直接导入,会出现在资源管理器的"Bitmap"类型下面;
2. 如果是其它格式, 先导入, 类型可能可以随便写什么,不过最好写RCDATA吧。
   然后打开.rc文件, 把类型修改成"RCDATA DISCARDABLE"。
   例如:
        IDR_JPG1    RCDATA DISCARDABLE    "texture.JPG"
   再进入资源管理器, 图片的ID应该出现在"Data"类型下面了。
3. 程序调用:
D3DXCreateTextureFromResource( m_pd3dDevice, NULL, MAKEINTRESOURCE(IDR_JPG1), &m_pTexture );
就搞定了。
说明:
    这个函数是D3D从rc资源中读取图片创建纹理的函数(我用的SDK版本是支持DX9b的Summer 2003,估计DX9版本内应该没什么变化)。但是秉承了DX文档的一贯优良传统,在我们为不断的出错抓狂的时候,配套文档中依然没有能有任何实质性帮助的内容。所以特别放到这里,希望能有机会帮到别人——因为狗狗上搜不到什么关于这个函数实际使用情况的中文文章。
参数1,D3D设备了,不用解释;
参数2,资源存储的模块,置NULL表示从调用的进程模块读取,一般情况下用NULL就可以,除非你的资源放在另外的DLL里面;
参数3,用多MFC绘图的人都知道,这里 绝对不是什么"IDB_BITMAP1"之类的实际路径名字,或者资源名称,而是用MAKEINTRESOURCE宏处理过的资源数据流(大概是这个意思吧?)
参数4,输出的纹理指针,不用解释了。
另外就是文档里面那个该死的说BMP类型要作为RC_BITMAP导入;其它类型要做为RT_RCDATA导入。根本没有多余说明,幸好在GameDev上面搜到了一个帖子里面有人提到使用其它类型资源,要把类型修改成 RCDATA DISCARDABLE。经过测试,bmp/png/jpg/tga都是没问题的。
错误情况
1.如果直接把第三个参数LPCTSTR写成"IDB_BITMAP1",就会出现D3DXERR_INVALIDDATA错误;
2.如果使用了BITMAP外其它类型的资源,而没有在.rc里面把类型修改成 RCDATA DISCARDABLE,也会出现D3DXERR_INVALIDDATA错误。



你可能感兴趣的:(Direct3D,C++)