游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6001|回复: 12

如何将一个纹理中的内容拷到另一个纹理的相应区域?

[复制链接]

22

主题

69

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2006-5-13 21:09:00 | 显示全部楼层 |阅读模式
如果是表面,就好做的一些,可以用IDirect3DDevice9::UpdateSurface();
如果是纹理应怎么做呢?我只找到IDirect3DDevice9::UpdateTexture()方法,但是参数是IDirect3DBaseTexture*类型的,调用这个方法也不能成功。我也试过锁定纹理的某个区域(IDirect3DTexture:ockRect()),但这个方法总用不好,还请大家指教!谢谢!

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2006-5-14 12:15:00 | 显示全部楼层

Re:如何将一个纹理中的内容拷到另一个纹理的相应区域?

"锁定纹理的某个区域(IDirect3DTexture:ockRect())"很好啊,只是慢了点
“IDirect3DDevice9::UpdateTexture()方法”参数是IDirect3DBaseTexture*很正常,你看看d3d纹理实际是什么类型吧
“可以用IDirect3DDevice9::UpdateSurface()”Tex->GetSurface();就可以得到纹理的表面了

17

主题

165

帖子

167

积分

注册会员

Rank: 2

积分
167
发表于 2006-5-15 10:20:00 | 显示全部楼层

Re:如何将一个纹理中的内容拷到另一个纹理的相应区域?

我也有一些疑问,我通过CreateTexture创建出来的一个Texture,通过调用GetSurfaceLevel可以获取到他的Surface.但是,我再用UpdateSurface把一个有资源的纹理向其Copy时,虽然UpdateSurface返回成功,但我LockRect这个Texture时,却是空的,绘制出来也是错误的.
不知道为什么,还望回答.

LPDIRECT3DTEXTURE9 lpTexBuf;
LPDIRECT3DTEXTURE9 lpTexSrc;

//创建2个texture
m_lpDev->CreateTexture( 128, 128, 1, 0, D3DFMT_A8R8G8B8,
                D3DPOOL_DEFAULT, &lpTexBuf, NULL );

D3DXCreateTextureFromFileEx(....., &lpTexSrc);

//UpdateSurface
LPDIRECT3DSURFACE9 lpSurfaceSrc;
lpTexSrc->GetSurfaceLevel( 0, &lpSurfaceSrc );

LPDIRECT3DSURFACE9 lpSurfaceBuf;
lpTexBuf->GetSurfaceLevel( 0, &lpSurfaceBuf );

RECT rect;
POINT pos;
pos.x = 0; pos.y = 0;
SetRect( &rect, 0, 0, 64, 64 );
m_lpDev->UpdateSurface( lpSurfaceSrc, &rect, lpSurfaceBuf, &pos );

不知道怎么会事.后面把Texture绘制出来就是没东西.




22

主题

69

帖子

69

积分

注册会员

Rank: 2

积分
69
 楼主| 发表于 2006-5-15 12:41:00 | 显示全部楼层

Re:如何将一个纹理中的内容拷到另一个纹理的相应区域?

谢谢!

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2006-5-15 12:47:00 | 显示全部楼层

Re: Re:如何将一个纹理中的内容拷到另一个纹理的相应区

kyo1984: Re:如何将一个纹理中的内容拷到另一个纹理的相应区域?

我也有一些疑问,我通过CreateTexture创建出来的一个Texture,通过调用GetSurfaceLevel可以获取到他的Surfa...

试下copy后把surface释放

2

主题

41

帖子

62

积分

注册会员

Rank: 2

积分
62
发表于 2006-5-15 18:17:00 | 显示全部楼层

Re:如何将一个纹理中的内容拷到另一个纹理的相应区域?

用 StretchRect

22

主题

69

帖子

69

积分

注册会员

Rank: 2

积分
69
 楼主| 发表于 2006-5-17 12:10:00 | 显示全部楼层

Re:如何将一个纹理中的内容拷到另一个纹理的相应区域?

LockRect
GetSurfaceLevel
这两种都会用了,现在用的是GetSurfaceLevel,如下:

pTex1->GetSurfaceLevel( 0, &pSurface1 );

pTex2->GetSurfaceLevel( 0, &pSurface2 );

D3DXLoadSurfaceFormSurface();//将pSurface1   pSurface2 作为参数

就可拷贝了!

另外:记得 IDirect3DDevice9::UpdateSurface  需要源表面:D3DPOOL_SYSTEMMEM ,目标表面:D3DPOOL_DEFAULT类型。

17

主题

165

帖子

167

积分

注册会员

Rank: 2

积分
167
发表于 2006-5-17 18:59:00 | 显示全部楼层

Re:如何将一个纹理中的内容拷到另一个纹理的相应区域?

使用D3DXLoadSurfaceFormSurface()确实完成了目标
感觉比UpdateSurface还好一点,
由于UpdateSurface对页面有要求,有的时候不能按要求完成特定的页面拷贝.
不知道D3DXLoadSurfaceFormSurface()相对于UpdateSurface效率如何?
毕竟最后的目的都是完成"将一个纹理中的内容拷到另一个纹理的相应区域"
其实在D3D里,还有一种纹理间的拷贝,就在GameRes上,
老帖了:http://dev.gameres.com/Program/Visual/3D/Render2Texture.htm

22

主题

69

帖子

69

积分

注册会员

Rank: 2

积分
69
 楼主| 发表于 2006-5-18 11:01:00 | 显示全部楼层

Re:如何将一个纹理中的内容拷到另一个纹理的相应区域?

更多的就不知道
只是试过,实时渲染,它比UpdateSurface慢很多

11

主题

43

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2006-5-18 18:48:00 | 显示全部楼层

Re:如何将一个纹理中的内容拷到另一个纹理的相应区域?

请问,多纹理,如何进行融合?

p_d3ddevice->SetTexture(0,p_Texture1);
p_d3ddevice->SetTexture(1,p_Texture2);

我想以p_Textur1为背景,
pTexture2为前景(通过透明色进行透明),这两个纹理进行融合,现在不不论怎么设置,都不行.只显示p_Texture1这个纹理.p_Texture2这个纹理不显示.

不知道如果设置?
或者有没有相关的sample进行研究一下?

谢谢!

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

本版积分规则

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

GMT+8, 2026-1-24 14:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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