自csdn: 有的回答很靠谱,有的不怎么靠谱.
我在一台计算机上做了个demo,然后在另外一台计算机上这个demo的texture创建不能成功,好像和创建的参数有关,所以贴出来,请大家看看
if( FAILED(dev->CreateTexture(width,height,0,D3DUSAGE_DYNAMIC,format,D3DPOOL_DEFAULT,&_texture,0) ) )
这个创建不能成功
改成如下就可以了
if( FAILED(dev->CreateTexture(width,height,0,0,format,D3DPOOL_MANAGED,&_texture,0) ) )
另外有一次是创建成功了,但是TextureSuface在Lock的时候失败。
FAILED(surface->LockRect(&lock_rc,0,0))
谁能讲一下这些参数的意思?看MSDN的帮助也看得一知半解的。
自csdn: 有的回答很靠普 ,有的不怎么靠普.
我在一台计算机上做了个demo,然后在另外一台计算机上这个demo的texture创建不能成功,好像和创建的参数有关,所以贴出来,请大家看看
if( FAILED(dev->CreateTexture(width,height,0,D3DUSAGE_DYNAMIC,format,D3DPOOL_DEFAULT,&_texture,0) ) )
这个创建不能成功
改成如下就可以了
if( FAILED(dev->CreateTexture(width,height,0,0,format,D3DPOOL_MANAGED,&_texture,0) ) )
另外有一次是创建成功了,但是TextureSuface在Lock的时候失败。
FAILED(surface->LockRect(&lock_rc,0,0))
谁能讲一下这些参数的意思?看MSDN的帮助也看得一知半解的。
回答:
主要原因是:D3DPOOL参数的选择问题.
简单的说,D3DPOOL_DEFAULT 将在显存中创建帖图,它是不能被LockRect的;
只能通过CopyRects()和UpdateTexture()来更新。设备Reset()的时候必须被释放。渲染的效率最高,但使用起来最麻烦。
D3DPOOL_MANAGED 在显存中创建帖图,在内存中也创建了一个备份,可以被
LockRect,修改的是内存中的位图。系统会自动更新显存中的位图。设备Reset()的时候不必须被释放。
D3DPOOL_SYSTEMMEM 只在内存中创建贴图,不在显存中创建。可以被LockRect设备Reset()的时候不必须被释放。渲染的效率最低。
在AGP显村中创建D3DUSAGE_DYNAMIC的纹理需要显卡硬件支持。 因为你使用了D3DPOOL_DEFAULT来创建,所以该纹理将会在agp中建立。
如果显卡不支持可以另外在系统内存中建立一个纹理,使用UpdateTexture方法来更新
也就是使用dev->CreateTexture(width,height,0,0,format,D3DPOOL_DEFAULT,&_texture,0)
来创建纹理1, 使用dev->CreateTexture(width,height,0,D3DUSAGE_DYNAMIC,format,D3DPOOL_SYSTEMMEM,&_texture,0)来创建纹理2
然后lock纹理2修改数据。使用device的UpdateTexture来更新纹理1。
这样纹理1是建立在显存中的(不是agp,是显卡内存)纹理2在系统内存中。虽然没有直接在agp中lock快,但是这样可以使用非discard方式lock纹理。而且也没有硬件支持方面的问题
我第一次创建的时候用了D3DUSAGE_DYNAMIC和D3DPOOL_DEFAULT,所以Texture将在AGP内存中创建,但是我的显卡硬件不支持,所以失败,是不是这样?(我的显卡芯片是NVidiaMX440的,怎么也不支持...)
另外突然发现显卡的内存有两种,一种是一般的显存,另一种是AGP,这两种有什么区别呢?我们买显卡的时候标示显存64M,这个64M是指一般的显存还是AGP中的内存?还是两个加起来?
一般的显存是指装在显卡上的本地内存,而AGP显存实际上就是主存的一部分。
如果不是板载的显卡,那标称的显存应该是指显卡上的内存,而不是AGP
不过让我郁闷的是我的华硕P4SE的主板竟然不支持在APG内存中创建贴图。。。(为啥主板会不支持?)
D3D应该是和硬件无关的.这个值得怀疑.....