惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
Microsoft Azure Blog
Microsoft Azure Blog
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
博客园_首页
阮一峰的网络日志
阮一峰的网络日志
V
V2EX
小众软件
小众软件
F
Fortinet All Blogs
Microsoft Security Blog
Microsoft Security Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
Google DeepMind News
Google DeepMind News
Jina AI
Jina AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
aimingoo的专栏
aimingoo的专栏
B
Blog RSS Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
宝玉的分享
宝玉的分享
有赞技术团队
有赞技术团队
J
Java Code Geeks
WordPress大学
WordPress大学
The Cloudflare Blog

博客园 - 稻草人的麦田

[导入]仔细研究了lithtech中的根据类名创建对象 [导入]光照优缺点 [导入]蜗牛的笔试题目 [导入]一个开发休闲游戏的程序组人与分配方案 [导入]运动模糊的制作 [导入]格里高里的数学题 [导入]水彩化 [导入]伪 HDR/Blow [导入]描边,只是换了个过滤器而已 [导入]锐化模糊 [导入]卷积积分(转) [导入]再贴个圆形马赛克 [导入]马赛克 [导入]hlsl的浮雕效果 [导入]游戏出了一个demo [导入]图形文件的格式(转载) [导入] 一些色彩方面的知识 [导入]流浪歌手 [导入][转载]游戏引擎列表
[导入]显卡对于mipmap选择的研究
稻草人的麦田 · 2008-01-03 · via 博客园 - 稻草人的麦田

Posted on 2008-01-03 20:04  稻草人的麦田  阅读(2139)  评论()    收藏  举报

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);
  }
 }

文章来源:http://songxiaoyu8.blog.163.com/blog/static/208181282008038354274