游戏开发论坛

 找回密码
 立即注册
搜索
查看: 14971|回复: 14

D3D中简单的截图方法

[复制链接]

63

主题

871

帖子

891

积分

高级会员

Rank: 4

积分
891
QQ
发表于 2005-3-21 17:17:00 | 显示全部楼层 |阅读模式
在渲染完所有东东后(Present之前)

获得BackBuffer表面

然后用D3DX的函数保存

void ScreenShot (char *filename)
{
  IDirect3DSurface9        *tmp = NULL;
  IDirect3DSurface9        *back = NULL;

  //生成固定颜色模式的离屏表面(Width和 Height为屏幕或窗口的宽高)
  D3D9Device->CreateOffscreenPlainSurface(Width, Height, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &tmp, NULL);

  // 获得BackBuffer的D3D Surface
  D3D9Device->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &back);

  // Copy一下,,需要时转换颜色格式
  D3DXLoadSurfaceFromSurface(tmp, NULL, NULL, back, NULL, NULL, D3DX_FILTER_NONE, 0);

  // 保存成BMP格式
  D3DXSaveSurfaceToFile(filename, D3DXIFF_BMP, tmp, NULL, NULL);

  // 释放Surface,防止内存泄漏
  SAFE_RELEASE(tmp);
  SAFE_RELEASE(back);
}

文件格式可以为:
D3DXIFF_BMP
    Microsoft Windows bitmap (BMP) file format.

D3DXIFF_JPG
    Joint Photographics Experts Group (JPEG) compressed file format.

D3DXIFF_PNG
    Portable Network Graphics (PNG) file format.

D3DXIFF_DDS
    Microsoft DirectDraw surface (DDS) file format.

D3DXIFF_DIB
    Windows device-independent bitmap (DIB) file format.

D3DXIFF_HDR
    High dynamic range file format.

D3DXIFF_PFM
    Portable float map file format.

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2005-3-21 18:01:00 | 显示全部楼层

Re:D3D中简单的截图方法

就是在哪个时候呀?在EndScene()前,还是Present()前,还是之后?
我始终截不了屏,GetBackbuffer()是S_OK,但D3DXSaveSurfaceToFile()就出错了,还有filename是怎么样,像"apple.bmp"吗?

63

主题

871

帖子

891

积分

高级会员

Rank: 4

积分
891
QQ
 楼主| 发表于 2005-3-21 18:43:00 | 显示全部楼层

Re:D3D中简单的截图方法

Present()之前

filename是文件名的字符串

窗口模式我没试过

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2005-3-21 19:19:00 | 显示全部楼层

Re:D3D中简单的截图方法

一定要全屏吗?
filename是"apple"还是"apple.bmp"

63

主题

871

帖子

891

积分

高级会员

Rank: 4

积分
891
QQ
 楼主| 发表于 2005-3-21 19:50:00 | 显示全部楼层

Re:D3D中简单的截图方法

我改了一下,,现在的可以适用于所有颜色模式

以前的在截非A8R8G8B8模式效果不好

试了一下,,窗口的也可以截

apple.bmp

0

主题

9

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2005-3-22 11:13:00 | 显示全部楼层

Re:D3D中简单的截图方法

嗯,好,谢谢,正需要这个,如果是视频的画面能不能截下来呢?

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2005-3-22 18:41:00 | 显示全部楼层

Re: Re:D3D中简单的截图方法

始终有问题。错误为:Failed to create scratch copy of vidmem surface
返回值不妥的是:D3DXLoadSurfaceFromSurface()
以下为截出来的图:
sf_2005322184114.bmp

63

主题

871

帖子

891

积分

高级会员

Rank: 4

积分
891
QQ
 楼主| 发表于 2005-3-22 19:07:00 | 显示全部楼层

Re:D3D中简单的截图方法

啊?我怎么截的好好的

看这个错误消息好像是backBuffer不对

把你的程序发来我看看QQ:214411834

63

主题

871

帖子

891

积分

高级会员

Rank: 4

积分
891
QQ
 楼主| 发表于 2005-3-22 19:32:00 | 显示全部楼层

Re:D3D中简单的截图方法

对了,,可能跟这个有关系:

我的backBuffer是用D3DSWAPEFFECT_DISCARD标志生成的

63

主题

871

帖子

891

积分

高级会员

Rank: 4

积分
891
QQ
 楼主| 发表于 2005-3-22 20:54:00 | 显示全部楼层

Re: D3D中简单的截图方法

看图,,这个是用我在程序中截的图(窗口模式)

由于她没把边框等加进去,,所以旁边有黑边

sf_2005322205426.bmp
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-16 13:47

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表