D3D GetRenderTargetData失败

姚小白 2016-08-18 03:51:47
加精
想先读取显存缓冲数据,然后修改显存缓冲数据,再进行显示,代码如下

//设置纹理
FAIL_RET( setViewMatrix(d3ddev,camera,zDepth));
FAIL_RET( d3ddev->SetTexture( 0, texture));
FAIL_RET(hr = d3ddev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE));
FAIL_RET(hr = d3ddev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE));
FAIL_RET(hr = d3ddev->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE));
FAIL_RET(hr = d3ddev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE));

FAIL_RET( d3ddev->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEXSPHERE) ) ); //set next source ( NEW )
FAIL_RET( d3ddev->SetFVF( D3DFVF_CUSTOM ) );
FAIL_RET( d3ddev->SetIndices(g_pIB));
FAIL_RET(d3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP,0,0,(g_segments+1)*(1+g_rings),0,2*(g_segments)*g_rings+g_segments-2+g_rings));
FAIL_RET( d3ddev->SetTexture( 0, NULL));

/*关键代码*/
IDirect3DSurface9 * pBackBuffer = NULL;
LPDIRECT3DSURFACE9 surface9 = NULL;
//获取后台缓存
hr = d3ddev->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&pBackBuffer);
hr = d3ddev->CreateOffscreenPlainSurface( d3dpp.BackBufferWidth,

d3dpp.BackBufferHeight,
d3dpp.BackBufferFormat,
D3DPOOL_DEFAULT,
&surface9,
NULL);
//以下语句返回 Invaild call
hr = d3ddev->GetRenderTargetData(pBackBuffer, surface9);
D3DLOCKED_RECT Source;
hr = surface9->LockRect(&Source,NULL,0);
/*对Source数据进行自己的操作*/

//操作后的数据 赋值给后台缓存
hr = d3ddev->StretchRect(surface9,NULL,pBackBuffer,NULL,D3DTEXF_NONE);
surface9->UnlockRect();

//绘制
FAIL_RET( d3ddev->BeginScene() );
d3ddev->SetRenderTarget(0,pBackBuffer);
FAIL_RET( d3ddev->EndScene());



目前是使用Texture纹理给一个球体贴上了文理, 我想在显示之前对其进行自己的处理

...全文
1503 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-08-18
  • 打赏
  • 举报
回复
去请教一下这位D3D达人? http://blog.csdn.net/pizi0475
姚小白 2016-08-18
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
检查每个函数调用的返回值?
恩 , 失败都是InvaildCall , 目前了解到: GetRenderTargetDate(),从显存拷贝到内存,因此surface创建要使用D3DPOOL_SYSTEMMEM,但是StretchRetc又不允许D3DPOOL_SYSTEMMEM的Surface赋值到pBackBuffer, 如果将surface设置为D3DPOOL_Default,可以,但是这样的话surface就不能通过GetRenderTargetDate获取到pBackBuffer的数据了。 是否可以直接对pBackBuffer进行处理? 试验过 pBackBuffer->LockRect(&lockedRect,NULL,0),但是现实失败,InvalidCall
赵4老师 2016-08-18
  • 打赏
  • 举报
回复
检查每个函数调用的返回值?

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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