Getbackbuffer为什么一直是黑屏?求高手指点,非常感谢。

iuvx4 2015-06-29 02:38:06
HRESULT hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow(), D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice);
hr = g_pd3dDevice->CreateOffscreenPlainSurface(ddm.Width, ddm.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pSurface, NULL);
//hr = g_pd3dDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pSurface);
hr = g_pd3dDevice->GetFrontBufferData(0, pSurface);
hr = D3DXSaveSurfaceToFile("d:/1.png", D3DXIFF_PNG, pSurface, NULL, NULL);

主要代码就是这个,下面会帖全部代码,
使用GetFrontBufferData总能成功截到图,使用GetBackBuffer总是黑屏,不知道为什么,请懂DirectX的高手指点一下,万分感谢。
...全文
409 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
chg_zzu 2018-06-25
  • 打赏
  • 举报
回复
有没有完整的代码?
iuvx4 2015-07-01
  • 打赏
  • 举报
回复
引用 9 楼 happy__888 的回复:
GetFrontBuffer在现代的计算机下速度还是可以的,虽然SDK里面提示会非常的慢,但是bitblt实际上也是这个同样的技术 快和慢和你的计算机硬件关系很大
谢谢你的回复!
iuvx4 2015-07-01
  • 打赏
  • 举报
回复
引用 7 楼 happy__888 的回复:
代码是copy网络上的,但是我过去也一直是那样用的 你截取的不是自己绘制的图? 如果是别的程序的窗口,或者系统桌面,用GetBackBuffer你是访问不到的,只能GetFrontBuffer获取
那怎么办?如果我想截全屏,而且还要非常快,达到60fps,又不想用mirror driver,就只能用bitblt了吗?我现在bitblt速度是20fps。
寻开心 2015-07-01
  • 打赏
  • 举报
回复
GetFrontBuffer在现代的计算机下速度还是可以的,虽然SDK里面提示会非常的慢,但是bitblt实际上也是这个同样的技术 快和慢和你的计算机硬件关系很大
寻开心 2015-06-30
  • 打赏
  • 举报
回复
在渲染完所有东西后,Present之前 获得BackBuffer表面 然后用D3DX的函数保存 void ScreenShot (char *filename) { IDirect3DSurface9 *tmp = NULL; IDirect3DSurface9 *back = NULL; //生成固定颜色模式的离屏表面(Width和 Height为屏幕或窗口的宽高) D3D9Device->CreateOffscreenPlainSurface(Width, Height, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &tmp, NULL); // 获得BackBuffer的D3D Surface D3D9Device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &back); // Copy一下,,需要时转换颜色格式 D3DXLoadSurfaceFromSurface(tmp, NULL, NULL, back, NULL, NULL, D3DX_FILTER_NONE, 0); // 保存成BMP格式 D3DXSaveSurfaceToFile(filename, D3DXIFF_BMP, tmp, NULL, NULL); // 释放Surface,防止内存泄漏 SAFE_RELEASE(tmp); SAFE_RELEASE(back); }
寻开心 2015-06-30
  • 打赏
  • 举报
回复
代码是copy网络上的,但是我过去也一直是那样用的 你截取的不是自己绘制的图? 如果是别的程序的窗口,或者系统桌面,用GetBackBuffer你是访问不到的,只能GetFrontBuffer获取
iuvx4 2015-06-30
  • 打赏
  • 举报
回复
引用 5 楼 happy__888 的回复:
在渲染完所有东西后,Present之前 获得BackBuffer表面 然后用D3DX的函数保存 void ScreenShot (char *filename) { IDirect3DSurface9 *tmp = NULL; IDirect3DSurface9 *back = NULL; //生成固定颜色模式的离屏表面(Width和 Height为屏幕或窗口的宽高) D3D9Device->CreateOffscreenPlainSurface(Width, Height, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &tmp, NULL); // 获得BackBuffer的D3D Surface D3D9Device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &back); // Copy一下,,需要时转换颜色格式 D3DXLoadSurfaceFromSurface(tmp, NULL, NULL, back, NULL, NULL, D3DX_FILTER_NONE, 0); // 保存成BMP格式 D3DXSaveSurfaceToFile(filename, D3DXIFF_BMP, tmp, NULL, NULL); // 释放Surface,防止内存泄漏 SAFE_RELEASE(tmp); SAFE_RELEASE(back); }
你这是直接百度的,我试过了,没用。
iuvx4 2015-06-29
  • 打赏
  • 举报
回复
引用 2 楼 happy__888 的回复:
presentParams.MultiSample = MultiSampleType.None; presentParams.BackBufferCount = 1; // 少了这个吧,默认是0
我刚才看到有人说backbuffer必须是自己绘出来的图才能查看,如果想截取系统的桌面就截取不到,有这种说法吗?
iuvx4 2015-06-29
  • 打赏
  • 举报
回复
引用 2 楼 happy__888 的回复:
presentParams.MultiSample = MultiSampleType.None; presentParams.BackBufferCount = 1; // 少了这个吧,默认是0
你是指增加d3dpp.BackBufferCount = 1;这一句吗? 我刚才试了下,没有变化。
寻开心 2015-06-29
  • 打赏
  • 举报
回复
presentParams.MultiSample = MultiSampleType.None; presentParams.BackBufferCount = 1; // 少了这个吧,默认是0
iuvx4 2015-06-29
  • 打赏
  • 举报
回复
LPDIRECT3D9 g_pD3D = NULL; D3DDISPLAYMODE ddm; D3DPRESENT_PARAMETERS d3dpp; IDirect3DDevice9 * g_pd3dDevice; IDirect3DSurface9 * pSurface; ZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS)); ZeroMemory(&d3dpp, sizeof(d3dpp)); g_pD3D = Direct3DCreate9(D3D_SDK_VERSION); g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &ddm); d3dpp.Windowed = TRUE; d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER; d3dpp.BackBufferFormat = ddm.Format; d3dpp.BackBufferHeight = ddm.Height; d3dpp.BackBufferWidth = ddm.Width; d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.hDeviceWindow = GetDesktopWindow(); d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; HRESULT hr = g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow(), D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice); hr = g_pd3dDevice->CreateOffscreenPlainSurface(ddm.Width, ddm.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pSurface, NULL); //hr = g_pd3dDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pSurface); hr = g_pd3dDevice->GetFrontBufferData(0, pSurface); hr = D3DXSaveSurfaceToFile("d:/1.png", D3DXIFF_PNG, pSurface, NULL, NULL); pSurface->UnlockRect(); pSurface->Release(); g_pd3dDevice->Release(); g_pD3D->Release(); 这是全部的代码

4,446

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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