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