请问读取x文件的D3DXLoadMeshFromX的unicode版本的超级郁闷问题
这个一个很经典的读取x文件mesh段落,很多教程都用这个,
但是我把项目改为unicode编译,就会出错,说LPSTR不能转换为LPWSTR
问题出在D3DXMATERIAL的pTextureFilename成员,它是LPSTR,在UNICODE下,
它还是LPSTR,而D3DXCreateTextureFromFile需要的是LPWSTR了
LPD3DXBUFFER pD3DXMtrlBuffer;
//从.x文件创建Mesh对象
::D3DXLoadMeshFromX(
m_pFileName, D3DXMESH_SYSTEMMEM, m_pDevice,
NULL, &pD3DXMtrlBuffer, NULL,
&m_dwNumSubsets, //返回模型中子集的数目
&m_pMesh ); //返回Mesh对象的接口指针
m_pMeshMaterials = new D3DMATERIAL9[m_dwNumSubsets];
m_pMeshTextures = new LPDIRECT3DTEXTURE9[m_dwNumSubsets];
//从接口指针pD3DXMtrlBuffer获得各个子集的材质和纹理图片的文件名
D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
for( DWORD i=0; i < m_dwNumSubsets; i++ )
{
//复制子集的材质
m_pMeshMaterials[i] = d3dxMaterials[i].MatD3D;
//Direct3D在调入Mesh模型时,没有设置材质的环境光颜色,
//这里把它设置成和漫反射一样的颜色。
m_pMeshMaterials[i].Ambient = m_pMeshMaterials[i].Diffuse;
//调入纹理图片,这里出错!!!!!!!!!!!
::D3DXCreateTextureFromFile(
m_pDevice,
d3dxMaterials[i].pTextureFilename, //纹理图片的文件名,就是这个参数,它竟然没有unicode版本
&m_pMeshTextures[i] );
}
pD3DXMtrlBuffer->Release(); //释放接口
问题点数:20、回复次数:4Top
1 楼iwaiwai()回复于 2005-03-04 08:57:30 得分 20
参见sdk的effectedit
你search“D3DXCreateTextureFromFile”函数
将会发现它将第二个参数定义为TCHAR
你也转换一下就ok了!Top
2 楼limiteee(无限电)回复于 2005-03-04 10:31:59 得分 0
可是有一个问题
D3DXMATERIAL是从LPD3DXBUFFER 里读出来的,D3DXMATERIAL是d3d自带的类型
就算是我去d3dx9mesh.h中把D3DXMATERIAL的定义改成tchar,那LPD3DXBUFFER 读出来的是tchar么?Top
3 楼limiteee(无限电)回复于 2005-03-04 10:41:29 得分 0
找到答案了,谢谢上面那位兄台了
WCHAR strPath[512];
if( d3dxMaterials[i].pTextureFilename != NULL )
{
WCHAR wszBuf[MAX_PATH];
MultiByteToWideChar( CP_ACP, 0, d3dxMaterials[i].pTextureFilename, -1, wszBuf, MAX_PATH );
wszBuf[MAX_PATH - 1] = L'\0';
DXUTFindDXSDKMediaFileCch( strPath, 512, wszBuf );
// Load the texture
D3DXCreateTextureFromFile( pd3dDevice, strPath, &g_ppMeshTextures[i] );
Top
4 楼iwaiwai()回复于 2005-03-04 20:41:14 得分 0
偶是女的,不是兄台
呵呵Top




