游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3675|回复: 3

IDirect3DTexture9::LockRect不支持D3DLOCK_NO_DIRTY_UPDATE如何解决?

[复制链接]

4

主题

69

帖子

205

积分

中级会员

Rank: 3Rank: 3

积分
205
发表于 2007-11-7 16:19:00 | 显示全部楼层 |阅读模式
发现有的机器IDirect3DTexture9:ockRect不支持D3DLOCK_NO_DIRTY_UPDATE如何解决?
因为我有时只希望更新纹理中的部分像素,如果不支持D3DLOCK_NO_DIRTY_UPDATE的话会导致D3DLOCKED_RECT的其它位置丢失.

如果没有更好的办法的话只能每次更新全部像素了

更惨的是还有的机器是不支持D3DUSAGE_DYNAMIC的动态纹理的,但这项是可以通过cap2检测到.

4

主题

69

帖子

205

积分

中级会员

Rank: 3Rank: 3

积分
205
 楼主| 发表于 2007-11-8 21:31:00 | 显示全部楼层

Re:IDirect3DTexture9::LockRect不支持D3DLOCK_NO_DIRTY_UPDATE如何解决?

在那台特殊的机器上使用D3DPOOL_DEFAULT参数创建纹理就不能D3DLOCK_NO_DIRTY_UPDATE Lock改为使用D3DPOOL_SYSTEMMEM创建就行了!

奇怪呀,不明所以然,望有了解的解说下。。(不甚感激

5

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2007-11-9 09:00:00 | 显示全部楼层

Re: IDirect3DTexture9::LockRect不支持D3DLOCK_NO_DIRTY_UPDATE如何解决?

用Default Pool创建的纹理是不能Lock的,而不仅仅是用D3DLOCK_NO_DIRTY_UPDATE不行.
想Default Pool是在显存中建立资源,我们是不能直接修改(通过Lock)这样的资源的.
而只有加上D3DUSAGE_DYNAMIC把资源建立在AGP内存才行.
要修改纹理,又不支持DYNAMIC TEXTURE的话,只能只能要Managed Pool了.虽然有效率损失.
一般没特殊要求(如频繁修改啊,做Render Target啊),就用Managed Pool,让D3D自己处理这些东西

欢迎交流Q20123512, hadx_yz@126.com

4

主题

69

帖子

205

积分

中级会员

Rank: 3Rank: 3

积分
205
 楼主| 发表于 2007-11-10 11:32:00 | 显示全部楼层

Re:IDirect3DTexture9::LockRect不支持D3DLOCK_NO_DIRTY_UPDATE如何解决?

用Default Pool创建的纹理是不能Lock的,而不仅仅是用D3DLOCK_NO_DIRTY_UPDATE不行.
想Default Pool是在显存中建立资源,我们是不能直接修改(通过Lock)这样的资源的.
而只有加上D3DUSAGE_DYNAMIC把资源建立在AGP内存才行.
要修改纹理,又不支持DYNAMIC TEXTURE的话,只能只能要Managed Pool了.虽然有效率损失.
一般没特殊要求(如频繁修改啊,做Render Target啊),就用Managed Pool,让D3D自己处理这些东西

在其它机器创建纹理时我默认的都是用D3DPOOL_DEFAULT的(首先肯定是的D3DUSAGE_DYNAMIC不然无法LockRect)
而且文档是有描述
D3DUSAGE_DYNAMIC and D3DPOOL_MANAGED are incompatible and should not be used together.

因为我的纹理来源是另一动态的bitmap就像directshow中获取视频一样必须一帧的获取并按像素更新到纹理中,不然肯定用Render Target的效率要比DYNAMIC TEXTURE好
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-18 21:55

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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