有一种比较简单的想法能比较快速的实现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);

好了,今天的微博就写到这里了。

posted on 2013-08-29 08:43  colorzc  阅读(2094)  评论(0编辑  收藏  举报