IDirect3DDevice9::CreateTexture

自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应该是和硬件无关的.这个值得怀疑.....

你可能感兴趣的:(d3d)