次の方法で共有


ミップマップによるテクスチャ フィルタリング

ミップマップによるテクスチャ フィルタリング

ミップマップとは連続したテクスチャで、各テクスチャは同じ画像を徐々に低解像度にしたものである。ミップマップでの各画像の高さと幅、つまりレベルは、直前のレベルよりも 2 の累乗だけ小さい。ミップマップは正方形である必要はない。

ユーザーに近いオブジェクトには、高解像度ミップマップ画像が使われる。オブジェクトが遠ざかるに従って、低解像度のミップマップ画像が使われる。ミップマップ処理により、レンダリングしたテクスチャの品質が向上するが、使用するメモリは増加する。

Microsoft® Direct3D® では、ミップマップはアタッチされたサーフェイスのチェーンとして表される。このチェーンの先頭には最高解像度のテクスチャがあり、その後には次のミップマップ レベルのテクスチャが続く。このレベルの後には次のレベルのミップマップが続く、という順に最低解像度のミップマップになるまで続いていく。

次の図は、これらのレベルの例を示している。ビットマップ テクスチャは、一人称型のゲームの 3D コンテナの側面にある記号を表している。ミップマップとして作成すると、最高解像度のテクスチャがこのセットの先頭にくる。このミップマップ セットの連続する各テクスチャは、高さと幅が 2 の累乗ずつ小さくなっていく。この場合、最高解像度のミップマップは 256 × 256 ピクセルである。次のテクスチャは 128 × 128 である。最後のテクスチャは 64 × 64 である。

この記号は可視範囲からの最大距離にある。この記号から遠く離れた位置からゲームを開始する場合、ミップマップ チェーンの中で最小のテクスチャ (この場合 64 × 64 のテクスチャ) が表示される。

危険を示す記号

ユーザーの視点がこの記号に近づくにつれて、徐々に高解像度のテクスチャが使われる。次の図の解像度は 128 × 128 である。

危険を示す記号

最高解像度のテクスチャが使われるのは、プレーヤの視点がこの記号に最も近づいたときである。

危険を示す記号

これは、テクスチャの見え方をシミュレートする方法の中では効率的な方法である。1 つのテクスチャを多くの解像度でレンダリングするよりも、さまざまな解像度で複数のテクスチャを使う方が高速である。

Direct3D では、ミップマップ セットの中でどのテクスチャが最も目的出力に近い解像度であるかを評価し、ピクセルをそのテクセル空間にマッピングできる。最終的な画像の解像度がミップマップ セット内のテクスチャ間にある場合、Direct3D では両方のミップマップのテクセルを調べ、その色値をブレンドする。

ミップマップを使うには、アプリケーションでミップマップのセットを作成する必要がある。アプリケーションでは、ミップマップ セットをカレント テクスチャ セットの最初のテクスチャとして選択して、ミップマップを適用する。詳細については、「テクスチャ ブレンディング」を参照すること。

次に、Direct3D でテクセルのサンプリングに使うフィルタリング方法を設定しなければならない。最も処理が速いミップマップ フィルタリングは、Direct3D で最も近いテクセルを選択する方法である。これ選択するには、D3DTEXF_POINT 列挙値を使用する。Direct3D では、D3DTEXF_LINEAR 列挙値を使用すると、より高品質なフィルタリング結果が得られる。このフィルタリングでは、最も近いミップマップが選択され、次に現在のピクセルがマッピングされるテクスチャ内の位置座標の周辺テクセルの加重平均を計算する。

ミップマップ テクスチャは、シーンのレンダリングに必要な時間を短縮するために 3D シーンで使われる。また、ミップマップ テクスチャを使うと、シーンのリアリティが増す。しかし、ミップマップ テクスチャを使うにはメモリが大量に必要となることが多い。

ミップマップ セットの作成

次の例は、IDirect3DDevice9::CreateTexture メソッドを呼び出して、256 × 256、128 × 128、64 × 64、32 × 32、16 × 16 の 5 段階のミップマップ レベルを構築する。

// This code example assumes that the variable d3dDevice is a
// valid pointer to a IDirect3DDevice9 interface.

IDirect3DTexture9 * pMipMap;
d3dDevice->CreateTexture(256, 256, 5, 0, D3DFMT_R8G8B8, D3DPOOL_MANAGED, &pMipMap);

IDirect3DDevice9::CreateTexture が受け取る最初の 2 つの引数は、最上位テクスチャのサイズと幅である。第 3 引数には、テクスチャのレベル数を指定する。この引数をゼロに設定すると、Direct3D はサーフェイスのチェーンを作成する。各サーフェイスは、直前のサーフェイスよりも 2 の累乗 1 つ分ずつ小さくなり、最終的に 1 × 1 の最小サイズになる。第 4 引数には、このリソースの使用方法を指定する。ここではゼロが指定されているので、リソースには特定の使用方法はないことを示す。第 5 引数には、テクスチャのサーフェイス フォーマットを指定する。この引数には、D3DFORMAT 列挙型の値を使う。第 6 引数には、作成したリソースを配置するメモリ クラスを示す D3DPOOL 列挙型のメンバを指定する。動的テクスチャを使っているのでなければ、D3DPOOL_MANAGED を勧める。最後の引数は、IDirect3DTexture9 インターフェイスへのポインタのアドレスとする。

  ミップマップ チェーンの各サーフェイスの大きさは、直前のサーフェイスの半分になる。最上位ミップマップの大きさが 256 × 128 の場合、2 番目のレベルのミップマップの大きさは 128 × 64 になり、3 番目のレベルは 64 × 32 という順にミップマップの大きさは小さくなり、最終的には 1 × 1 になる。Levels では、チェーンのミップマップの幅または高さのいずれかが 1 より小さくなるようなミップマップ レベル数を指定することはできない。簡単な例を示すと、最上位のミップマップ サーフェイスが 4 × 2 の場合、Levels の最大値は 3 である。最上位レベルの大きさが 4 × 2 である場合、2 番目のレベルは 2 × 1、3 番目のレベルは 1 × 1 になる。Levels の値が 3 よりも大きい場合、第 2 レベルのミップマップで高さは分数になる。したがって、これは許可されない。

ミップマップの選択と表示

IDirect3DDevice9::SetTexture メソッドを呼び出して、カレント テクスチャの一覧内の先頭のテクスチャとしてミップマップ テクスチャを設定する。詳細については、「テクスチャ ブレンディング」を参照すること。

ミップマップ テクスチャ セットを選択した後、D3DTEXTUREFILTERTYPE 列挙型からの値を D3DSAMP_MIPFILTER サンプラ ステートに割り当てなければならない。これにより、Direct3D はミップマップ テクスチャ フィルタリングを自動的に実行する。次のサンプル コードでは、ミップマップ テクスチャ フィルタリングが有効にされている。

d3dDevice->SetTexture(0, pMipMap);
d3dDevice->SetTextureStageState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

また、IDirect3DTexture9::GetSurfaceLevel メソッドを使い、取得するミップマップ レベルを指定することで、ミップマップ サーフェイスのチェーンを手動でトラバースできる。次の例では、最高解像度から最低解像度までミップマップ チェーンをトラバースする。

IDirect3DSurface9 * pSurfaceLevel;
for (int iLevel = 0; iLevel < pMipMap->GetLevelCount(); iLevel++)
{
    pMipMap->GetSurfaceLevel(iLevel, &pSurfaceLevel);
    //Process this level.
    pSurfaceLevel->Release();
}

チェーンのミップマップ サーフェイスの各サーフェイスにビットマップ データをロードするために、アプリケーションではミップマップ チェーンを手動でトラバースする必要がある。通常、この理由からチェーンをトラバースする。アプリケーションは、IDirect3DBaseTexture9::GetLevelCount を呼び出して、ミップマップに格納されているレベルの数を取得できる。