游戏开发论坛

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

[DX9]如何将后台缓冲拷贝到IDirect3DTexture9里??

[复制链接]

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
发表于 2012-4-18 16:37:00 | 显示全部楼层 |阅读模式
我用IDirect3DDevice9::GetBackBuffer()获取表面,这本身没啥问题,但是由于我需要将他转到IDirect3DTexture9里面去,这就得需要LockRect这个后台表面,但是接着却发现,DX9在初始化设备的时候,必须带有D3DPRESENTFLAG_LOCKABLE_BACKBUFFER标志才能LockRect成功,而这个东西又会降低应用程序的性能,所以,就给难住了。

而我又不想用RTT来做,因为已经有了GetBackBuffer()了,
请问各位大侠,除了通过LockRect方式将表面像素拷贝到IDirect3DTexture9里面去,还有什么别的方法?? [em24]

0

主题

398

帖子

577

积分

高级会员

Rank: 4

积分
577
发表于 2012-4-19 09:50:00 | 显示全部楼层

Re:[DX9]如何将后台缓冲拷贝到IDirect3DTexture9里??

用StretchRect

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2012-4-19 10:10:00 | 显示全部楼层

Re: Re:[DX9]如何将后台缓冲拷贝到IDirect3DTexture9里??

artint: Re:[DX9]如何将后台缓冲拷贝到IDirect3DTexture9里??

用StretchRect


请问,如果我的纹理在系统内存里(D3DPOOL_MANAGED或D3DPOOL_SYSTEMMEM),有没办法拷贝进去 [em24]

0

主题

398

帖子

577

积分

高级会员

Rank: 4

积分
577
发表于 2012-4-20 10:37:00 | 显示全部楼层

Re:[DX9]如何将后台缓冲拷贝到IDirect3DTexture9里??

用GetRendertargetData....

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2012-4-20 13:42:00 | 显示全部楼层

Re: Re:[DX9]如何将后台缓冲拷贝到IDirect3DTexture9里??

artint: Re:[DX9]如何将后台缓冲拷贝到IDirect3DTexture9里??

用GetRendertargetData....


这招不行的。

0

主题

398

帖子

577

积分

高级会员

Rank: 4

积分
577
发表于 2012-4-20 18:04:00 | 显示全部楼层

Re:[DX9]如何将后台缓冲拷贝到IDirect3DTexture9里??

哪里不行?

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2012-4-21 12:22:00 | 显示全部楼层

Re: Re:[DX9]如何将后台缓冲拷贝到IDirect3DTexture9里??

artint: Re:[DX9]如何将后台缓冲拷贝到IDirect3DTexture9里??

哪里不行?



IDirect3DSurface9* pRenderTargete = NULL;
pD3DDevice->GetRenderTarget(0, &pRenderTargete);

IDirect3DSurface9* pDstSurface = NULL;
pD3DDevice->CreateOffscreenPlainSurface(1024, 768, D3DFMT_A8R8G8B8, D3DPOOL_SYSTEMMEM, &pDstSurface, NULL);

if (FAILED(pD3DDevice->GetRenderTargetData(pRenderTargete, pDstSurface)))
    MessageBoxA(0, "失败", 0, MB_OK);

总是失败

0

主题

27

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2012-4-22 10:10:00 | 显示全部楼层

Re:[DX9]如何将后台缓冲拷贝到IDirect3DTexture9里??

你是出于什么样的目的,需要将后台缓冲拷贝到Texture中呢?
我猜想一下:1,渲染游戏以外的画面,就是渲染第二个画面。2,获取截屏。
但是,这两种目的都有比上面所说的有更好,更高效的解决办法。渲染第二个画面可以使用渲染到纹理的方法,而你所要做的只是切换渲染的目标(RenderTarget):
DWORD usage = D3DUSAGE_RENDERTARGET;
D3DFORMAT format = D3DFMT_A8R8G8B8;
D3DPOOL pool = D3DPOOL_DEFAULT;
if(FAILED(D3DXCreateTexture(pd3dDevice, width, height, 1, usage, format, pool, &pTexOut->texture)))
                return 0;
if(FAILED(pd3dDevice->CreateDepthStencilSurface( width, height, D3DFMT_D24S8, D3DMULTISAMPLE_NONE, 0,
                TRUE, &pSurface, NULL )))
                return 0;
以上是创建可作为渲染目标的纹理,使用的时候和其它纹理没有区别。以下是切换渲染目标:
//store the devie
LPDIRECT3DSURFACE9 pOldRT = NULL;
pd3dDevice->GetRenderTarget(0, &pOldRT);
LPDIRECT3DSURFACE9 pOldDSurface = NULL;
pd3dDevice->GetDepthStencilSurface(&pOldDSurface);
//设置新的目标和DepthStencil
LPDIRECT3DSURFACE9 pDMSurface = NULL;
texture->GetSurfaceLevel(0, &pDMSurface);
pd3dDevice->SetRenderTarget(0, pDMSurface);//set new render target
pd3dDevice->SetDepthStencilSurface(Your DepthStencil Surface);
//开始渲染画面
//切换回默认渲染目标
pd3dDevice->SetDepthStencilSurface(pOldDSurface);
SAFE_RELEASE(pOldDSurface);
pd3dDevice->SetRenderTarget(0, pOldRT);
SAFE_RELEASE(pOldRT);

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2012-4-22 16:47:00 | 显示全部楼层

Re: Re:[DX9]如何将后台缓冲拷贝到IDirect3DTexture9里??

Luna: Re:[DX9]如何将后台缓冲拷贝到IDirect3DTexture9里??

你是出于什么样的目的,需要将后台缓冲拷贝到Texture中呢?
我猜想一下:1,渲染游戏以外的画面,就是渲染...


no
我要实现的是屏幕淡入淡出特效.

27

主题

295

帖子

305

积分

中级会员

Rank: 3Rank: 3

积分
305
发表于 2012-4-22 18:10:00 | 显示全部楼层

Re:[DX9]如何将后台缓冲拷贝到IDirect3DTexture9里??

看到了你要的目的差点晕倒
神经病...杀鸡用牛刀

一行代码就解决了  直接画一张全黑的到最上层
然后控制alpha值 就是淡入淡出效果了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-28 12:11

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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