`

VB 实现保存 Direct3D 游戏截图

    博客分类:
  • vb
阅读更多

Written By Microsoft MVP: Eric DeBrosse
In this article, I will explain how to save a screen shot from a Visual Basic 6 Direct3D8 application. This could be difficult to figure out on your own, since the VB SDK documentation does not mention the SaveSurfaceToFile method of the D3DX8 class. One thing that seems to cause confusion is the SrcPalette parameter. Even if you are not using indexed colors, you must still pass an un-initialized PALETTEENTRY structure to the SaveSurfaceToFile function. Passing Nothing will cause the function to fail.
Have a look at a simple function:

Public Sub SaveScreenShot(ByVal sFilename As String)
Dim oSurface As Direct3DSurface8
Dim SrcPalette As PALETTEENTRY
Dim SrcRect As RECT
Dim DispMode As D3DDISPLAYMODE

'get display dimensions
g_oDevice.GetDisplayMode DispMode

'create a surface to put front buffer on,
'GetFrontBuffer always returns D3DFMT_A8R8G8B8
Set oSurface = g_oDevice.CreateImageSurface(DispMode.Width, _
DispMode.Height, _
D3DFMT_A8R8G8B8)

'get data from front buffer
g_oDevice.GetFrontBuffer oSurface

'we are saving entire area of this surface
With SrcRect
.Left =
0
.Right = DispMode.Width
.Top =
0
.Bottom = DispMode.Height
End With

'save this surface to a BMP file
g_oD3DX.SaveSurfaceToFile sFilename, _
D3DXIFF_BMP, _
oSurface, _
SrcPalette, _
SrcRect
End Sub


The above function assumes g_oDevice is a valid Direct3DDevice8 object and g_oD3DX is a valid D3DX8 object.
First, we need to get the dimensions of the screen. If we were to use the GetViewport method to get the dimensions, it would fail on a device created with the D3DCreate_PUREDEVICE flag. Since GetFrontBuffer() always needs an image surface the size of the screen, (even when in windowed mode) the GetDisplayMode method is used and should not be an issue with pure devices.
Next, we create a new surface using the dimensions of our screen. The surface should be created using the D3DFMT_A8R8G8B8 format, because the GetFrontBuffer method always returns this format; regardless of the current back buffer format. We are using the GetFrontBuffer method to capture our screen shot, since it is the only way to capture anti-aliased output. The final call to SaveSurfaceToFile writes the entire captured surface to the specified bitmap file.
Notes: This function does not check for any errors! You should always set up some kind of error trap in any DirectX application, it makes it so much easier to debug. You could, for instance, validate the path and filename before actually trying to save the file. The function could also be easily modified to return a result code.

分享到:
评论

相关推荐

    3D世界游戏源代码

    "3D世界游戏源代码"的学习价值在于,通过实际操作,你可以看到VB如何调用Direct3D API来创建3D场景,理解图形管线的工作流程,以及掌握3D游戏开发的基本流程。这对于初学者来说是一次宝贵的学习和实践经验,能帮助...

    3D迷宫游戏的源程序

    在VB(Visual Basic)环境中,可以使用Direct3D或OpenGL库来实现3D图形的绘制。玩家在游戏中的移动、视角变化都需要通过这些技术实现。 2. **迷宫生成算法**:生成一个具有挑战性的3D迷宫通常需要特定的算法,如...

    用C# VB加载保存.x文件

    在IT行业中,C#和VB(Visual Basic)都是.NET框架下的编程语言,广泛应用于桌面应用、Web应用以及游戏开发等领域。本主题聚焦于如何在这些语言中加载和保存以“.x”为扩展名的文件。这类文件通常是3D模型或场景文件...

    VB版3D文字制作软件源码.7z

    VB虽然不像更专业的图形库如OpenGL或Direct3D那样直接支持3D图形,但通过自定义算法,依然能够实现这些功能。 颜色设置和大小调整是软件的重要组成部分。VB提供了多种方法来处理颜色,例如Color对话框可以让用户...

    精彩编程与编程技巧-用VB编写DirectX7.0游戏(上)...

    - **Direct3D**:专门用于3D图形渲染,支持硬件加速和复杂的光照效果。 - **DirectSound**:提供音频播放、混音等功能,支持多声道音频处理。 - **DirectInput**:处理输入设备如键盘、鼠标和游戏控制器的数据。 **...

    VB制作文字拖尾动画.rar

    【VB制作文字拖尾动画】是一个使用Visual Basic(VB)编程语言实现的项目,它展示了如何创建具有拖尾效果的文字或图像。这个程序的核心技术是基于融合技术和DirectX(DX)模板缓冲,使得动态效果更加逼真且具有3D...

    vb.net+2010 DX摄像头源码

    1. **DirectX和DirectShow**:DirectX是一个综合性的库,包含了多个子API,如Direct3D(3D图形),DirectDraw(2D图形),DirectSound(声音)等。DirectShow是DirectX的一部分,专为媒体流处理设计,支持视频捕获、...

    Direct3D9ActionGame:使用 Direct3D9 的 2.5D 动作游戏

    在这个项目中,开发者使用了C#编程语言,这在游戏开发领域相对不常见,因为Direct3D通常与C++结合使用,但通过SlimDX库,C#开发者也能方便地访问Direct3D的功能。 SlimDX 是一个开源的.NET库,它为DirectX提供了...

    地下城3D地图编辑机代码

    `IDirect3DRMFrame3`是Direct3D Render Manager(RM)的一部分,用于管理3D场景中的框架和变换。这个链接可能是开发者为了查阅相关API文档而保存的。 7. **MapIt.vbp、MapIt.vbw**: 这两个文件是Visual Basic项目...

    用DirectX8库写的程序

    开发者可能使用VB编程语言中的API调用来创建和填充顶点缓冲区,然后通过Direct3D将它们渲染到屏幕上。 索引缓冲区则用于优化渲染效率,通过提供一个索引列表来指定顶点的绘制顺序,减少了显卡处理重复顶点的次数。...

    可旋转的3D立方体(9KB)

    在编程中,实现这样的功能可能使用了专门的图形库或API,例如OpenGL、Direct3D或者现代Web开发中的WebGL。 描述中的“9KB”暗示这是一个非常轻量级的应用,这意味着开发者可能采用了高效的数据结构和算法来压缩代码...

    基于SHARPDX制作的旋转,有切边和不切边两种保存方式

    SharpDX是一个开源的.NET库,它为Windows应用程序提供了直接访问Microsoft DirectX API的能力,包括Direct3D 11、Direct2D、DirectWrite、WIC等组件。在图形编程中,旋转是常见的变换操作,可以改变对象在屏幕上的...

    VB编程资源大全(源码 多媒体)

    mpsdll.ZIP 可以播放mp3的dll,并附有一个完整的示例程序(82KB) 59,startfld.ZIP 利用 Direct3D 模拟星际飞行的画面(4KB) 60,animate.ZIP 一个屏幕动画的演示程序(还可以) (118KB) 61,bouncel....

    VB_XNCS.rar_GDI/图象编程_Visual_Basic_

    在本项目中,开发者可能使用Direct3D来提升游戏的图形性能,实现更流畅的动画和更真实的3D视觉效果。 4. **数据库集成**: 文件`map.mdb`可能是Access数据库文件,用于存储游戏中的地图数据、城市信息等。VB支持与...

    画出一个旋转的立方体(7KB)

    4. **OpenGL或Direct3D**:虽然没有明确指出使用的图形库,但在Windows平台上,常见的3D图形API是OpenGL或Direct3D。这两个库提供了处理3D图形和动画的函数和结构,使得开发者可以更方便地创建旋转立方体这样的效果...

    控制WINDOWS的音量大小(6KB)

    DirectSound是微软开发的一套多媒体编程接口,它提供了低级的声音处理能力,包括音量控制、回声消除、3D音效等。通过调用DirectSound的API函数,开发者可以创建自己的音量控制程序。 在这个压缩包中,包含了几个...

    vc++ 应用源码包_1

    实现了屏幕绘图操作,实现电子标尺数据计算以及显示,有数据库操作保存数据。 VC++ ini文件读写操作类实例 VC++版源代码统计工具 内含自绘CMenu、CButton、CDialog、CStatic、CListCtrl等。 VC++6.0 控制摄像头 ...

    vc++ 应用源码包_2

    实现了屏幕绘图操作,实现电子标尺数据计算以及显示,有数据库操作保存数据。 VC++ ini文件读写操作类实例 VC++版源代码统计工具 内含自绘CMenu、CButton、CDialog、CStatic、CListCtrl等。 VC++6.0 控制摄像头 ...

    vc++ 应用源码包_6

    实现了屏幕绘图操作,实现电子标尺数据计算以及显示,有数据库操作保存数据。 VC++ ini文件读写操作类实例 VC++版源代码统计工具 内含自绘CMenu、CButton、CDialog、CStatic、CListCtrl等。 VC++6.0 控制摄像头 ...

    vc++ 应用源码包_5

    实现了屏幕绘图操作,实现电子标尺数据计算以及显示,有数据库操作保存数据。 VC++ ini文件读写操作类实例 VC++版源代码统计工具 内含自绘CMenu、CButton、CDialog、CStatic、CListCtrl等。 VC++6.0 控制摄像头 ...

Global site tag (gtag.js) - Google Analytics