捕捉DIRECTX程序屏幕(Saving a Screen Shot in a Direct3D Application)

——ZH1110

 

 

 在此文章中,我将要解释如何保存VisualBasic6 & DIRECTX程序屏幕到一位图文件.我们使用D3DX8类的SaveScreenShot函数.SrcPalette参数看上去比较容易扰乱视线.因为不管你是否创建索引颜色,你必须通过一个未初始化的 PALETTEENTRY结构到 SaveSurfaceToFile函数. 如果通过 Nothing 会产生失败.

  最后说一下D3DX8对象,它不直接参与渲染,目的是为了简化各种任务如:创建贴图(CreateTexture),管理网格(CreateMesh),装配shaders(AssembleShader)等等。

 

看一下这个简单的函数:

Public Sub SaveScreenShot(ByVal sFilename As String)

 

Dim g_D3DX As New D3DX8

Dim oSurface As Direct3DSurface8
Dim SrcPalette As PALETTEENTRY '因为256色索引颜色已淘汰所以不再讨论调色板
Dim SrcRect As RECT '保存表面的区域
Dim DispMode As D3DDISPLAYMODE '显示模式


'取得显示模式
g_D3DDevice.GetDisplayMode DispMode
'创建一个surface对象存放前景缓冲。
Set oSurface = g_D3DDevice.CreateImageSurface(DispMode.Width,DispMode.Height,D3DFMT_A8R8G8B8)
'取得前景缓冲数据
g_D3DDevice.GetFrontBuffer oSurface
'我们保存这个表面全部区域
With SrcRect
.Left = 0

.Top = 0
.Right = DispMode.Width
.Bottom = DispMode.Height
End With

'保存这个表面到一BMP文件
g_D3DX.SaveSurfaceToFile sFilename, D3DXIFF_BMP, oSurface, SrcPalette, SrcRect


End Sub
 

上面函数假设 g_D3DDevice已创建。

   首先我们取得屏幕大小,(如果要捕捉窗口还要用API函数ClientToScreen,GetWindowRect取得图片框区域),然后我们创建一个和屏幕一样大小的surface.因为GetFrontBuffer函数不管当前背景缓冲是什么格式总是返回D3DFMT_A8R8G8B8,所以oSurface也要定义成D3DFMT_A8R8G8B8(32位真彩色格式).再用 GetFrontBuffer函数取得前景, 这是唯一获得抗锯齿输出的方法. 最后用 SaveSurfaceToFile 写到BMP文件。

 

注意:这个函数没有任何错误检查语句。在任何DirectX程序中你总要建立错误检查以方便调试。比如在保存实际文件前检查路径是否有效。这个函数也很容易加入返回数值.

 

 

  

文件下载