DirectX屏幕截图:为什么GetBackBuffer总是给我一个黑色的图像
DirectX screen capture: Why GetBackBuffer always gives me a black image?
我的问题是使用DirectX捕获全屏图像,无论运行什么应用程序。我试图通过使用GetBackBuffer函数来捕捉屏幕(因为我被警告GetFrontBufferData非常慢,和GDI一样慢)
然而,当我尝试它时,GetFrontBufferData可以很好地捕捉屏幕,但GetBackBuffer总是给我一个黑色图像。
有些人告诉我,GetBackBuffer只得到你在屏幕上画的东西。如果你什么都没画,你什么也得不到。如果你想通过使用GetBackBuffer函数来捕捉屏幕图像,那是不可能的。是这样吗?
我尝试的代码是:
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);//Getbackbuffer gives me a black image
hr = g_pd3dDevice->GetFrontBufferData(0, pSurface);//getfrontbufferdata works well
hr = D3DXSaveSurfaceToFile("d:/1.png", D3DXIFF_PNG, pSurface, NULL, NULL);
pSurface->UnlockRect();
pSurface->Release();
g_pd3dDevice->Release();
g_pD3D->Release();
那些告诉你GetBackbuffer只得到你画的东西的人告诉你真相。每个使用Direct3D的应用程序都有自己的后台缓冲区,这些缓冲区只包含该应用程序在其中绘制的内容。您的应用程序有自己的后台缓冲区,其中只包含应用程序提取的内容。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '