D3D9中如果不用D3DX函数库怎么加载纹理 [复制链接] fg5823820 骑都尉(从五品) 注册时间 2011-12-28 积分 217 串个门 加好友 打招呼 发消息 发表于 2011-12-30 12:45:56 | 显示全部楼层 由于最近加载纹理出现各种问题,在这里一些帖子里看到说最好不用D3DX函数,但如果不用D3DX函数该怎么加载纹理?网上貌似找不到相关资料,大概是我的搜索能力有限吧。 根据lidudu给出的方法分为加载图片、解码图片、放缩到2的指数次方、最后创建D3D纹理对象,不知道前面两部是不是可以用GDI+来做,终于放缩到2的指数次方看起来会涉及图片的插值算法,创建纹理我只找到了IDirect3DDevice9::CreateTexture这个接口,难道是用这个接口创建好纹理后直接把内存数据memcpy过去? 使用道具 举报 sssa2000 版主 注册时间 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,值得一看 使用道具 举报 fg5823820 骑都尉(从五品) 注册时间 2011-12-28 积分 217 串个门 加好友 打招呼 发消息 发表于 2011-12-30 17:39:34 | 显示全部楼层 sssa2000 发表于 2011-12-30 12:57 对, 1、IDirect3DDevice9::CreateTexture 2、lock texture 看了那个例子,不过照用的时候纹理加载不怎么正确,于是把关键的拷贝改成这样 if( SUCCEEDED( pStagingTexture->LockRect(0 /*i*/, &LockedRect, NULL, 0 ) ) ) { BYTE* pDestBits = ( BYTE* )LockedRect.pBits; // Copy stride line by line //for( UINT h = 0; h < NumRows; h++ ) //{ // memcpy_s( pDestBits, LockedRect.Pitch, pSrcBits, RowBytes ); // pDestBits += LockedRect.Pitch; // pSrcBits += RowBytes; //} memcpy(LockedRect.pBits,pSrcBits,sizeof(DWORD)*iWidth*iHeight); pStagingTexture->UnlockRect( /*i*/0 ); } 复制代码 虽然尝试加载了两张纹理都感觉没什么问题,不过在担心这样弄是否安全 使用道具 举报 yulier 上骑都尉(正五品) 注册时间 2009-10-19 积分 602 串个门 加好友 打招呼 发消息 发表于 2011-12-31 12:39:10 | 显示全部楼层 fg5823820 发表于 2011-12-30 17:39 看了那个例子,不过照用的时候纹理加载不怎么正确,于是把关键的拷贝改成这样虽然尝试加载了两张纹理都感 ... 为什么还要放缩到2的指数次方, 不是有auto gen mipmap么 使用道具 举报 solidyang 飞骑尉(从六品) 注册时间 2010-5-26 积分 52 串个门 加好友 打招呼 发消息 发表于 2011-12-31 20:23:10 | 显示全部楼层 理论上很安全,实在不放心,就一行行memcpy。 使用道具 举报 fg5823820 骑都尉(从五品) 注册时间 2011-12-28 积分 217 串个门 加好友 打招呼 发消息 发表于 2012-1-1 16:36:20 | 显示全部楼层 yulier 发表于 2011-12-31 12:39 为什么还要放缩到2的指数次方, 不是有auto gen mipmap么 那个是D3DX函数才有的功能,自己写的话就要考虑缩放问题 使用道具 举报 fg5823820 骑都尉(从五品) 注册时间 2011-12-28 积分 217 串个门 加好友 打招呼 发消息 发表于 2012-1-1 16:37:20 | 显示全部楼层 solidyang 发表于 2011-12-31 20:23 理论上很安全,实在不放心,就一行行memcpy。 我发现只能一行一行的来,而且是倒过来拷贝,否则图形是倒过来的囧 使用道具 举报 yulier 上骑都尉(正五品) 注册时间 2009-10-19 积分 602 串个门 加好友 打招呼 发消息 发表于 2012-1-2 00:07:11 | 显示全部楼层 fg5823820 发表于 2012-1-1 16:37 我发现只能一行一行的来,而且是倒过来拷贝,否则图形是倒过来的囧 那pitch应该是负的,根据pitch判断是要正序copy还是倒过来copy 使用道具 举报 wellbye 轻车都尉(从四品) 注册时间 2009-10-15 积分 1287 串个门 加好友 打招呼 发消息 发表于 2012-1-2 13:10:54 | 显示全部楼层 用freeimage加载即可。渲染器只需提供创建空纹理的函数,锁定住,自己把加载好的数据一行行memcpy进去。 使用道具 举报 fg5823820 骑都尉(从五品) 注册时间 2011-12-28 积分 217 串个门 加好友 打招呼 发消息 发表于 2012-1-3 10:11:07 | 显示全部楼层 wellbye 发表于 2012-1-2 13:10 用freeimage加载即可。渲染器只需提供创建空纹理的函数,锁定住,自己把加载好的数据一行行memcpy进去。 ... 真是好东西,非常感谢! 使用道具 举报 fg5823820 骑都尉(从五品) 注册时间 2011-12-28 积分 217 串个门 加好友 打招呼 发消息 发表于 2012-1-3 10:12:32 | 显示全部楼层 wellbye 发表于 2012-1-2 13:10 用freeimage加载即可。渲染器只需提供创建空纹理的函数,锁定住,自己把加载好的数据一行行memcpy进去。 ... 顺便问个,如果用渲染器创建空纹理然后传出纹理接口,然后在别的线程用此接口锁定纹理填充,这样的操作是安全的吗