有一种比较简单的想法能比较快速的实现DirectX11 程序运行截图。
在当前场景帧进行Present()操作之前,渲染结果存储在交换链(Swap Chain)的后缓冲区中。我们定义一个Texture2D 对象,调用IDXGISwapChain类中的GetBuffer()方法可以将当前后缓冲区的绘制结果复制到该Texture2D对象中:
HRESULT GetBuffer(
[in] UINT Buffer,
[in] REFIID riid,
[in, out] void **ppSurface
);
例子:(来源于MSDN)
ID3D11Texture2D * p_RT;
g_pSwapChain->GetBuffer(0, __uuidof(p_RT), reinterpret_cast<void**>(&p_RT));
当p_RT中获取了当前待绘制的场景帧内容后,调用DirectX11 的D3DX11SaveTextureToFile()方法将其存至指定文件位置(经过测试,该方法不能自动创建新文件夹):
HRESULT D3DX11SaveTextureToFile(
ID3D11DeviceContext *pContext,
_In_ ID3D11Resource *pSrcTexture,
_In_ D3DX11_IMAGE_FILE_FORMAT DestFormat,
_In_ LPCTSTR pDestFile
);
该方法从ID3D11Resource对象 (ID3D11Texture2D 是它的派生类)中获取纹理内容,按照指定的D3DX11_IMAGE_FILE_FORMAT将图像保存在pDestFile位置,其中,D3DX11_IMAGE_FILE_FORMAT有如下值:
typedef enum D3DX11_IMAGE_FILE_FORMAT {
D3DX11_IFF_BMP = 0,
D3DX11_IFF_JPG = 1,
D3DX11_IFF_PNG = 3,
D3DX11_IFF_DDS = 4,
D3DX11_IFF_TIFF = 10,
D3DX11_IFF_GIF = 11,
D3DX11_IFF_WMP = 12,
D3DX11_IFF_FORCE_DWORD = 0x7fffffff
} D3DX11_IMAGE_FILE_FORMAT, *LPD3DX11_IMAGE_FILE_FORMAT;
这部分代码也很简单:
D3DX11SaveTextureToFile(g_pImmediateContext,p_RT,D3DX11_IFF_JPG,filename);
好了,今天的微博就写到这里了。