D3DMXLoadSurfaceFromFile 失败

zengsheng 2009-03-25 02:13:11
我按如下加载surface:

if(FAILED(g_pd3dmDevice->CreateImageSurface(D3DMX_DEFAULT,D3DMX_DEFAULT,D3DMFMT_A8R8G8B8,&g_pSurface)))
{
return E_FAIL;
}

D3DMXIMAGE_INFO * pImageInfo = new D3DMXIMAGE_INFO ;

if(FAILED(D3DMXLoadSurfaceFromFile(g_pSurface,NULL,NULL,TEXT("\\Storage Card\\Frog 8-RGB.png"),
NULL,D3DMX_FILTER_NONE,0,pImageInfo)) )
{

delete pImageInfo;

int i = GetLastError();
return E_FAIL;
}

但是最后LoadSurface出错!
i = 6,请问是什么原因??

谢谢
...全文
222 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
yulai_tidus 2010-09-14
  • 打赏
  • 举报
回复
和LZ碰到一样的问题,弄了很久没解决
cytlyy 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zengsheng 的回复:]
就是说我不能使用
HRESULT hre=D3DMXLoadSurfaceFromFileInMemory(srcSurface,NULL,NULL,pRes, cbRes,NULL,D3DMX_DEFAULT,0xFF000000,NULL);//


而是用你的方法来代替!

画到DC 上了以后,在调用原来的代码:

lt->GetSurfaceLevel(0,&backbuffer);//获取纹理第一层的表面
if(FAILED(D3DMXLoadSurfaceFromSurface(backbuffer,NULL,NULL,srcSurface,NULL,NULL,D3DMX_FILTER_NONE,0)))
{
return E_FAIL;
}

[/Quote]
差不多。最后一点不对,不用D3DMXLoadSurfaceFromSurface,这个函数我没用过估计也可以,最好用StretchRect拷贝。
zengsheng 2009-03-31
  • 打赏
  • 举报
回复
就是说我不能使用
HRESULT hre=D3DMXLoadSurfaceFromFileInMemory(srcSurface,NULL,NULL,pRes, cbRes,NULL,D3DMX_DEFAULT,0xFF000000,NULL);//


而是用你的方法来代替!

画到DC 上了以后,在调用原来的代码:

lt->GetSurfaceLevel(0,&backbuffer);//获取纹理第一层的表面
if(FAILED(D3DMXLoadSurfaceFromSurface(backbuffer,NULL,NULL,srcSurface,NULL,NULL,D3DMX_FILTER_NONE,0)))
{
return E_FAIL;
}

是这个逻辑么??
cytlyy 2009-03-31
  • 打赏
  • 举报
回复
如果是这样的话,只能按我原先的方法:
if( SUCCEEDED(g_pd3dmSurfaceNew->GetDC(&hDC)))
{
//在这里将你的图片画到hDC上
g_pd3dmSurfaceNew->ReleaseDC(hDC);
}
zengsheng 2009-03-31
  • 打赏
  • 举报
回复
cytlyy:

if(FAILED(D3DMXCreateTexture(g_pd3dmDevice,100,100,0,D3DMUSAGE_RENDERTARGET,D3DMFMT_R5G6B5,texpool,<)))
{
return E_FAIL;
}

这样还是白色的!
cytlyy 2009-03-31
  • 打赏
  • 举报
回复
D3DMXCreateTexture( g_pd3dmDevice,
100,100, 0, D3DMUSAGE_RENDERTARGET ,
D3DMFMT_R5G6B5 , texpool, &g_pTexture )
这样试下。应该差不多。
zengsheng 2009-03-31
  • 打赏
  • 举报
回复
cytlyy:
g_pd3dmDevice->CreateTexture( 100, 100, 1,
D3DMUSAGE_DYNAMIC, D3DMFMT_R5G6B5,
texpool, <);

确实出错了!

我用D3DMXCreateTexture 替换!
if(FAILED(D3DMXCreateTexture(g_pd3dmDevice,100,100,1,D3DMUSAGE_DYNAMIC,D3DMFMT_R5G6B5,texpool,<)))
{
return E_FAIL;
}

创建成功!

但是画出来还是白色!
cytlyy 2009-03-31
  • 打赏
  • 举报
回复
这个恐怕不行,我没有做过小的DEMO程序,做的都是给公司的完整的应用程序,所以不能外漏的。你有什么问题,可以帮你看看。
关于mobile下d3d的资料的确很少,应该说基本上没有,所以你可以先看下PC上的direct3d,虽然很多在mobile上不支持的,但大部分方法还是可以借鉴的。
zengsheng 2009-03-31
  • 打赏
  • 举报
回复
cytlyy :
能不能把你的DEMO 给我看看呢? 我发现这方面资料太少了!

谢谢!
zengsheng 2009-03-31
  • 打赏
  • 举报
回复
好的,谢谢cytlyy!
cytlyy 2009-03-31
  • 打赏
  • 举报
回复
你要往表面的DC上画图片,又不是直接加载图片。所以没关系。
zengsheng 2009-03-31
  • 打赏
  • 举报
回复
D3DMXCreateTexture 在mobile 上加载png也只能用D3DMFMT_R5G6B5 ??
cytlyy 2009-03-31
  • 打赏
  • 举报
回复
D3DMFORMAT的类似于D3DMFMT_R5G6B5我都试过,在PC上大部分都用D3DMFMT_A8R8G8B8,而mobile上好像只能用D3DMFMT_R5G6B5这个参数,所以D3DMXLoadSurfaceFromFile 用这个函数加载jpg,png图片是不行的。
所以最通用的方法就是我跟你讲的。在表面的DC上将各种格式的图片画上去。
zengsheng 2009-03-31
  • 打赏
  • 举报
回复
cytlyy:

非常感谢你!

按你的方法,我可以画出来了!
但是还有一个问题需要请教:就是D3DMXCreateTexture 里面有一个参数:D3DMFORMAT ,我看很多都用D3DMFMT_R5G6B5这个值
请问如果我是png图片呢?? 或者其他图片如jpg呢??我怎么得到正确的值? 你有好的方法么??
cytlyy 2009-03-31
  • 打赏
  • 举报
回复
先CreateImageSurface,在这个表面的DC上画,最后利用StretchRect将这个表面的图像copy到backbuffer上。
zengsheng 2009-03-31
  • 打赏
  • 举报
回复

cytlyy:
我GetDC并不成功阿!

if(FAILED(D3DMXCreateTexture(g_pd3dmDevice,D3DMX_DEFAULT,D3DMX_DEFAULT,0,D3DMUSAGE_RENDERTARGET,D3DMFMT_R5G6B5,texpool,<)))
{
return E_FAIL;
}

LPDIRECT3DMOBILESURFACE backbuffer=NULL;//定义纹理表面
lt->GetSurfaceLevel(0,&backbuffer);//获取纹理第一层的表面

HDC hDC;
if( SUCCEEDED(backbuffer->GetDC(&hDC))) //此处判断并不成功!
{

backbuffer->ReleaseDC(hDC);
}
zengsheng 2009-03-30
  • 打赏
  • 举报
回复
我换成D3DMFMT_R5G6B5,加载也成功了,就是画出来的图像是白色的。我用的是sdk自带的例子tut05_textures,
里面那张图片IDB_BANANA应该是黄色的才对,但是生成的图形皮肤是白色的!

但是每个地方都加载成功了的!为什么最后画出来时白色的???
cytlyy 2009-03-30
  • 打赏
  • 举报
回复
g_pd3dmDevice->CreateTexture( 100, 100, 1,
D3DMUSAGE_DYNAMIC, D3DMFMT_R5G6B5,
texpool, <);
这个代码我原来也用过,不过好像一直没有成功,你可以看一下这个函数是不是返回失败了。你可以用D3DMXCreateTexture代替它。
zengsheng 2009-03-30
  • 打赏
  • 举报
回复


现在的图片就是用的bmp图片,直接改的tut05_textures!


cytlyy : 谢谢帮我看看呢!

我是这样画的:

LPDIRECT3DMOBILETEXTURE lt;
g_pd3dmDevice->CreateTexture( 100, 100, 1,
D3DMUSAGE_DYNAMIC, D3DMFMT_R5G6B5,
texpool, <);


D3DMSURFACE_DESC pDesc;//纹理表面描述
lt->GetLevelDesc(0,&pDesc);//获取纹理表面,纹理可以有很多层,一般都用第一层

LPDIRECT3DMOBILESURFACE srcSurface=NULL;//定义表面
LPDIRECT3DMOBILESURFACE backbuffer=NULL;//定义纹理表面

if(D3DM_OK!=(g_pd3dmDevice->CreateImageSurface(pDesc.Width,//宽
pDesc.Height,//高
pDesc.Format,//不带ALPHA通道的24位像素样式
&srcSurface //目标表面,这个函数创建一个表面,宽和高以及format必须跟纹理一样
)))
{
MessageBox(NULL,TEXT("creatsurfaceerror!"),TEXT("LOAD PIC ERROR"),MB_OK);
}



HRSRC hRsrs = FindResource(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BANANA), RT_BITMAP);

HANDLE hRes = LoadResource(GetModuleHandle(NULL), hRsrs);
DWORD cbRes = SizeofResource(GetModuleHandle(NULL), hRsrs);
LPVOID pRes = LockResource(hRes);

//int size = 0;
//char * p;

//size = loadInMemory("\\Storage Card\\Frog 8-RGBA.png",&p);

HRESULT hre=D3DMXLoadSurfaceFromFileInMemory(srcSurface,NULL,NULL,pRes, cbRes,NULL,D3DMX_DEFAULT,0xFF000000,NULL);//

if(FAILED(hre))
{
MessageBox(NULL,TEXT("loadsurfaceerror!"),TEXT("LOAD PIC ERROR"),MB_OK);
}
lt->GetSurfaceLevel(0,&backbuffer);//获取纹理第一层的表面
if(FAILED(D3DMXLoadSurfaceFromSurface(backbuffer,NULL,NULL,srcSurface,NULL,NULL,D3DMX_FILTER_NONE,0)))
{
return E_FAIL;
}
cytlyy 2009-03-30
  • 打赏
  • 举报
回复
我没有用过D3DMXLoadSurfaceFromFile这个函数,我都是利用Surface的DC来往这个Surface上画图片的。因为D3DMFMT_R5G6B5这个参数好像只支持BMP格式的图片。所以你想要画其他格式的图片就需要先将其他图片画到这个DC上。
如:
if( SUCCEEDED(g_pd3dmSurfaceNew->GetDC(&hDC)))
{
//在这里将你的图片画到hDC上
g_pd3dmSurfaceNew->ReleaseDC(hDC);

}
加载更多回复(4)

7,657

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧