游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5597|回复: 11

如何让Direct3D的Surface不会随着窗体的拉伸而拉伸

[复制链接]

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2011-8-22 15:04:00 | 显示全部楼层 |阅读模式
我用Direct3D的D3DXGetImageInfoFromFile获取图片的尺寸等信息,然后用CreateOffscreenPlainSurface创建了一个面,再用D3DXLoadSurfaceFromFile加载了一个图片到面上,最后用了UpdateSurface以及Present等函数将其显示出来。但现在的问题是,刚显示出来的时候,图片是正常的,但如果我拖动窗体的边框,让窗口变大或者变小,图像也会按照一定的比例(不知道是个什么比例)放大或缩小。

我希望的是在我拖动窗体边框调整窗体大小的时候,图片保持不变,这该如何做到?望高手指教!

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2011-8-23 07:50:00 | 显示全部楼层

Re:如何让Direct3D的Surface不会随着窗体的拉伸而拉伸

难道没有人遇到过这类问题吗?

1

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2011-8-24 17:33:00 | 显示全部楼层

Re: 如何让Direct3D的Surface不会随着窗体的拉伸而拉伸

DX9的话,用RHW顶点格式可以实现。

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
发表于 2011-8-24 18:58:00 | 显示全部楼层

Re:如何让Direct3D的Surface不会随着窗体的拉伸而拉伸

窗口大小变了的话,就需要处理设备丢失,否则图像肯定会被缩放.

9

主题

62

帖子

62

积分

注册会员

Rank: 2

积分
62
发表于 2011-8-25 09:34:00 | 显示全部楼层

Re:如何让Direct3D的Surface不会随着窗体的拉伸而拉伸

在调用present函数的时候是会产生缩放效果的,所以问题在于你的后台缓冲大小与窗口大小不匹配了,但这并不是设备丢失,不过处理方法类似:你需要重新设置后台缓冲大小,重置设备,并重新设置视图和投影矩阵

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
发表于 2011-8-25 18:30:00 | 显示全部楼层

Re: Re:如何让Direct3D的Surface不会随着窗体的拉伸而拉伸

无心大师: Re:如何让Direct3D的Surface不会随着窗体的拉伸而拉伸

在调用present函数的时候是会产生缩放效果的,所以问题在于你的后台缓冲大小与窗口大小不匹配了,但这并不是设备丢失,不过处理方法类似:你需要重新设置后台缓冲大小,重置设备,并重新设置视图和投影矩阵


对。.

1

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2011-8-26 11:47:00 | 显示全部楼层

Re: Re:如何让Direct3D的Surface不会随着窗体的拉伸而拉伸

无心大师: Re:如何让Direct3D的Surface不会随着窗体的拉伸而拉伸

在调用present函数的时候是会产生缩放效果的,所以问题在于你的后台缓冲大小与窗口大小不匹配了,但这并不是设备丢失,不过处理方法类似:你需要重新设置后台缓冲大小,重置设备,并重新设置视图和投影矩阵


我的浅显理解。
重新设置视图和投影矩阵是比较费的,用RHW顶点格式就可以实现。

89

主题

4036

帖子

4132

积分

论坛元老

Rank: 8Rank: 8

积分
4132
发表于 2011-8-28 01:50:00 | 显示全部楼层

Re:如何让Direct3D的Surface不会随着窗体的拉伸而拉伸

。。。。楼上威武

10

主题

149

帖子

149

积分

注册会员

Rank: 2

积分
149
QQ
发表于 2011-8-28 07:50:00 | 显示全部楼层

Re: Re:如何让Direct3D的Surface不会随着窗体的拉伸而拉伸

轩辕崇正: Re:如何让Direct3D的Surface不会随着窗体的拉伸而拉伸

窗口大小变了的话,就需要处理设备丢失,否则图像肯定会被缩放.


处理设备丢失....啊哈哈哈!轩辕崇正就是一个纯粹的理论家啊,重设设备?你以为调用一个API就行了?你还必须首先释放所有explicit render targets, depth stencil surfaces, additional swap chains, state blocks, and D3DPOOL_DEFAULT resources associated with the device. 重设之后,你还得重新恢复这些东西!想想吧,就你那样混乱的程序,一释放一恢复怕给折腾死了吧,哈哈哈!

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2011-8-30 16:50:00 | 显示全部楼层

Re:如何让Direct3D的Surface不会随着窗体的拉伸而拉伸

恢复资源关键是:有状态的资源。

> 使用拉的方式处理绘制,可以让大多数资源都没有状态。

> 用delegate可以解决有状态的资源:delegate的capsure保持了资源的状态,恢复时从硬盘解压(这个过程要能够无状态)并加载。
比如说:
首先 pTex = new CTexture((ITexCreator *)new CMyTexCreatorA (L"resource string 111", args));
然后 pTex = new CTexture((ITexCreator *)new CMyTexCreatorB (L"resource string 222", args2));
lost时,调用 pTex->m_pTexCreator->Create(); 即可。
(或者也可以让各种纹理类继承 ITexCreatable)

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

本版积分规则

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

GMT+8, 2025-6-8 14:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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