关于D3d取背景效率问题

shine0415 2009-01-16 04:02:54
小弟有点问题提问劳驾一下大家,希望得到大家的帮助。谢谢
我想做一个特下,即图片叠加和融合的操作。如果比如欠两个图片叠加了,用叠加的结果和第三个混合。
我的思路是把前两个叠加后,从背景中取出叠加结果。保存到一个LPDIRECT3DTEXTURE9,然后在跟第三个混合。
可是我去背景拷贝到LPDIRECT3DTEXTURE9效率太高。大家有没有更好的办法。
我在D3D中想或得想得到背景图片用的方法是:
char * pBackBuffer = NULL;
LPDIRECT3DSURFACE9 l_BackSurface = NULL; //获得背景存储为文件

m_pD3DDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &l_BackSurface);
D3DLOCKED_RECT d3dl_rect;
m_OffScreenSurface->LockRect(&d3dl_rect, NULL, NULL );

pBackBuffer = (char *)d3dl_rect.pBits; // 此处就是保存背景位图的指针

D3DLOCKED_RECT stLockedRect;
m_pBackTexture->LockRect( 0, &stLockedRect, NULL,
D3DLOCK_NO_DIRTY_UPDATE|
D3DLOCK_NOSYSLOCK|D3DLOCK_READONLY);

char *pch=(char *)stLockedRect.pBits;
int lpitchlen = m_BackWidth*4;
for (int i=0;i<m_BackHeight;i++)
{
memcpy(pch, pBackBuffer, lpitchlen); //此处操作了背景区域的内容,为此CPU上去了
pch += stLockedRect.Pitch;
pBackBuffer += d3dl_rect.Pitch;
}
m_pBackTexture->UnlockRect(0);
m_OffScreenSurface->UnlockRect();

pBackBuffer这是显存数据。我一秒中执行10词这个操作,CPU在15%左右。只要对pBackBuffer
操作CPU就高。按说这个操作是可以基本不占用CPUde
各位有好的办法吗?谢谢您。
...全文
159 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
coldant 2009-01-27
  • 打赏
  • 举报
回复
帮顶
IONPhantom 2009-01-23
  • 打赏
  • 举报
回复
非常不建议使用LockBackBuffer! LockBackBuffer是一个非常不好的动作,不到万不得已不要使用,因为当LockBackBuffer之后会打断D3D的渲染流程,在Lock的时候D3D的渲染会被中断直到Unlock,这样会大大降低运行效率.
如果要想得到或者修改离屏的渲染结果一般的方法是RenderToTexture
像你要求的这种简单操作就像1楼说的那样完全能够应付,多重纹理
菜牛 2009-01-17
  • 打赏
  • 举报
回复
还有嫌效率太高的?
shine0415 2009-01-17
  • 打赏
  • 举报
回复
可是我用多重纹理想让第三层按不透明的方式混合,及上面相当与第三层纹理叠加上去了。您能不能帮帮我。我的邮件wanghui0415@hotmail.com.非常感谢。
zzz822163 2009-01-16
  • 打赏
  • 举报
回复
多重纹理呀

19,464

社区成员

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

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