正确使用 d3d9 的后台缓冲功能
Using d3d9's backbuffer functionalities correctly
我正在尝试编写一个简单的DLL,它允许我截取调用它的程序的屏幕截图。
该程序使用DLL调用给我它的窗口句柄。
根据返回的HRESULT值,CreateDevice函数CreateOffScreenPlainSurface使用提供的句柄运行良好。
但是输出图像是空白的,那么我认为我没有正确使用DirectX的GetBackBuffer函数。
以下是我的操作方法:
HRESULT GFBD_r = g_pd3dDevice->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pSurface);
HRESULT LR_r = pSurface->LockRect(&lr, &rect, D3DLOCK_READONLY);
memcpy(&Frame[0], lr.pBits, Width*Height*4);
pSurface->UnlockRect();
我的帧向量仍然为空。也许问题来自多重采样?我不完全理解它是如何工作的,只是我使用的是d3dpp.MultiSampleType=D3DMULTISAMPE_NONE;在我的D3DPRESENT_PARAMETERS中。
为现有窗口创建D3D设备不允许捕获其内容,即使该窗口是使用硬件加速渲染的。如果窗口已经有一个D3D设备,那么创建该设备的API调用应该失败(iirc)。如果窗口被绘制为使用常规的Windows API(即GDI),D3D内容将根据Windows版本与其他内容组成,或者以未定义的方式表现。这样的组合将在访问后台缓冲区后发生,并且(很可能)在其他地方发生。
相关文章:
- 如何使用原子指针执行双缓冲
- 消费者和生产者问题的双重缓冲
- 如何检测是否在缓冲绘画动画中绘制最后一帧?
- 我似乎无法修改帧缓冲
- 如何在C++中写入 1000 个文件时有效地缓冲
- Windows 后台服务(系统配置文件)无法使用 C++ 访问 win 10 上的用户 appData 文件夹?
- 递归函数调用在后台工作
- 帧缓冲纹理变为白色(片段着色器不会影响它)
- 如何制作启动 Python 脚本的 linux 后台进程(在 c 中)
- 我是否使用双缓冲?
- 目标C++,如何在后台线程中使用运行循环?
- OpenGL:使用实例化绘图与我正在绘制的帧缓冲进行绘制
- 与Qt同时运行后台循环或回调C++应用程序?
- 媒体基金会:WavSink以比实时消耗率更快的速度处理音频-是否可以实时限制后台处理
- 如何强制文件描述符缓冲我的输出
- 为什么我的线程不在后台运行?
- 是否有可能让 c++ dll 在后台运行 python 程序并让它填充向量图?如果是这样,如何?
- 在后台循环,同时运行其他语句 C++
- 零MQ 后台线程创建
- 正确使用 d3d9 的后台缓冲功能