[导入]显卡对于mipmap选择的研究

http://songxiaoyu8.blog.163.com/blog/static/208181282008038354274/


d3d本身提供了一个mipmap用于一幅图像生成多个表面,以便根据贴图距离屏幕的远近来进行不同表面的选择,

节约显存,一直用起来挺方便,因为是硬件帮助我们完成的,可是如果想要自己写一个纹理管理器的时候,就

产生了这样一个思考,什么时候切换mipmap的等级哪?这个问题挺难想的,一张图像有好几个等级的话,那么

这个图像在不同的深度是否需要进行mipmap哪?虽然一些很nb的游戏都是自己写的mipmap,然后自己去管理,

就像我公司用的lithtech引擎也是自己预先生成了一系列的mipmap,或者自己指定mipmap的数量,但是

lithtech有个问题就是不能自己写不同层级的mipmap的图像,其实我认为制作这个功能不用太费资源的,可能

是防止美术人员太自由发挥,从而不同层级的图像时会产生插值问题。
虽然近期还没有自己写纹理管理器的打算(都让显卡他们managed着先),但还是做了个实验,也是随便实验了

一下,结果发现一个显卡更加令人奇怪的事情,归纳是:一张图像可以每个象素选取不同层级的surface,而且

并不是深度大的地方一定选取的是level大的地方的层级(这个可能和纹理的复用方式有关,但肯定还有其他原

因)。这样子就可以归纳为,一个图像上的纹理在gpu上mipmap的选择也是逐象素选择的,也不知道对不对,可

能是自己用了shader的原因。
贴图如下:


我的选择是Level:0   红色 
          Level:1   绿色  
          Level:2   蓝色
其他层级黑色。共八个level

仔细看,就会发现我说的情况,看来水平还是差的太远,一直浮在上面没用的。

希望以后可以解决:我的测试代码如下:

 __int32 lc = g_pMeshTexture->GetLevelCount();
 D3DLOCKED_RECT LockedRect;
 D3DSURFACE_DESC pDesc;
 for(int lcc=0; lcc<lc; lcc++)
 {
  g_pMeshTexture->GetLevelDesc(lcc,&pDesc);
  //memset(LockedRect,0,sizeof(D3DLOCKED_RECT)*pDesc.Width*pDesc.Height);
  if( g_pMeshTexture->LockRect(lcc,&LockedRect,NULL,D3DLOCK_DISCARD) == D3D_OK )
  {
  DWORD *c = (DWORD*)(LockedRect.pBits);
  for(int i=0;i<pDesc.Width;i++)
  {
   for(int j=0;j<pDesc.Height;j++)
   {
   int index = i * LockedRect.Pitch / 4 + j;
   DWORD flags=lcc;
   switch(lcc)
   {
   case 0:
    c[index] = 0xffff0000 ; // red  
    break;
   case 1:
    c[index] = 0xff00ff00;
    break;
   case 2:
    c[index] = 0xff0000ff;
    break;
   default:
   c[index] = 0x00000000;
    break;
   }
 
   }
  }
  g_pMeshTexture->UnlockRect(lcc);
  }
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值