[導入]顯卡對於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);
  }
 }

發佈了4 篇原創文章 · 獲贊 4 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章