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