D3D9中如果不用D3DX函数库怎么加载纹理 [复制链接] fg5823820 骑都尉(从五品) Rank: 9Rank: 9Rank: 9 注册时间2011-12-28积分217 串个门加好友打招

D3D9中如果不用D3DX函数库怎么加载纹理 [复制链接]

   

Rank: 9Rank: 9Rank: 9

注册时间
2011-12-28
积分
217
  发表于 2011-12-30 12:45:56  | 显示全部楼层
由于最近加载纹理出现各种问题,在这里一些帖子里看到说最好不用D3DX函数,但如果不用D3DX函数该怎么加载纹理?网上貌似找不到相关资料,大概是我的搜索能力有限吧。

根据lidudu给出的方法分为加载图片、解码图片、放缩到2的指数次方、最后创建D3D纹理对象,不知道前面两部是不是可以用GDI+来做,终于放缩到2的指数次方看起来会涉及图片的插值算法,创建纹理我只找到了IDirect3DDevice9::CreateTexture这个接口,难道是用这个接口创建好纹理后直接把内存数据memcpy过去?
 
 
   

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

注册时间
2009-5-6
积分
3283
  发表于 2011-12-30 12:57:22  | 显示全部楼层
本帖最后由 sssa2000 于 2011-12-30 13:03 编辑

对,
1、IDirect3DDevice9::CreateTexture
2、lock texture
3、memcpy
4、unlock texture

defalut的纹理麻烦一些,dx有个例子DDSWithoutD3DX,值得一看
 
 
   

Rank: 9Rank: 9Rank: 9

注册时间
2011-12-28
积分
217
  发表于 2011-12-30 17:39:34  | 显示全部楼层
sssa2000 发表于 2011-12-30 12:57 
对,
1、IDirect3DDevice9::CreateTexture
2、lock  texture

看了那个例子,不过照用的时候纹理加载不怎么正确,于是把关键的拷贝改成这样
  1.                 if( SUCCEEDED( pStagingTexture->LockRect(0 /*i*/, &LockedRect, NULL, 0 ) ) )
  2.                 {
  3.                         BYTE* pDestBits = ( BYTE* )LockedRect.pBits;

  4.                         // Copy stride line by line
  5.                         //for( UINT h = 0; h < NumRows; h++ )
  6.                         //{
  7.                         //        memcpy_s( pDestBits, LockedRect.Pitch, pSrcBits, RowBytes );
  8.                         //        pDestBits += LockedRect.Pitch;
  9.                         //        pSrcBits += RowBytes;
  10.                         //}
  11.                         memcpy(LockedRect.pBits,pSrcBits,sizeof(DWORD)*iWidth*iHeight);

  12.                         pStagingTexture->UnlockRect( /*i*/0 );
  13.                 }
复制代码
虽然尝试加载了两张纹理都感觉没什么问题,不过在担心这样弄是否安全
 
 
   

Rank: 12Rank: 12Rank: 12

注册时间
2009-10-19
积分
602
  发表于 2011-12-31 12:39:10  | 显示全部楼层
fg5823820 发表于 2011-12-30 17:39 
看了那个例子,不过照用的时候纹理加载不怎么正确,于是把关键的拷贝改成这样虽然尝试加载了两张纹理都感 ...

为什么还要放缩到2的指数次方, 不是有auto gen mipmap么
 
 
   

Rank: 5Rank: 5

注册时间
2010-5-26
积分
52
  发表于 2011-12-31 20:23:10  | 显示全部楼层
理论上很安全,实在不放心,就一行行memcpy。
 
 
   

Rank: 9Rank: 9Rank: 9

注册时间
2011-12-28
积分
217
  发表于 2012-1-1 16:36:20  | 显示全部楼层
yulier 发表于 2011-12-31 12:39 
为什么还要放缩到2的指数次方, 不是有auto gen mipmap么

那个是D3DX函数才有的功能,自己写的话就要考虑缩放问题
 
 
   

Rank: 9Rank: 9Rank: 9

注册时间
2011-12-28
积分
217
  发表于 2012-1-1 16:37:20  | 显示全部楼层
solidyang 发表于 2011-12-31 20:23 
理论上很安全,实在不放心,就一行行memcpy。

我发现只能一行一行的来,而且是倒过来拷贝,否则图形是倒过来的囧
 
 
   

Rank: 12Rank: 12Rank: 12

注册时间
2009-10-19
积分
602
  发表于 2012-1-2 00:07:11  | 显示全部楼层
fg5823820 发表于 2012-1-1 16:37 
我发现只能一行一行的来,而且是倒过来拷贝,否则图形是倒过来的囧

那pitch应该是负的,根据pitch判断是要正序copy还是倒过来copy
 
 
   

Rank: 13Rank: 13Rank: 13Rank: 13

注册时间
2009-10-15
积分
1287
  发表于 2012-1-2 13:10:54  | 显示全部楼层
用freeimage加载即可。渲染器只需提供创建空纹理的函数,锁定住,自己把加载好的数据一行行memcpy进去。
 
 
   

Rank: 9Rank: 9Rank: 9

注册时间
2011-12-28
积分
217
  发表于 2012-1-3 10:11:07  | 显示全部楼层
wellbye 发表于 2012-1-2 13:10 
用freeimage加载即可。渲染器只需提供创建空纹理的函数,锁定住,自己把加载好的数据一行行memcpy进去。 ...

真是好东西,非常感谢!
 
 
   

Rank: 9Rank: 9Rank: 9

注册时间
2011-12-28
积分
217
  发表于 2012-1-3 10:12:32  | 显示全部楼层
wellbye 发表于 2012-1-2 13:10 
用freeimage加载即可。渲染器只需提供创建空纹理的函数,锁定住,自己把加载好的数据一行行memcpy进去。 ...

顺便问个,如果用渲染器创建空纹理然后传出纹理接口,然后在别的线程用此接口锁定纹理填充,这样的操作是安全的吗
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值