ミップマップ
■ミップマップ
ミップマップはカメラからの距離近いければ解像度の高いテクスチャを使用し、
遠くなるにつれて解像度の低いテクスチャを使用する高速化の手法です。
●メリット
・高速化
高解像度の画像を距離が遠くなるにつれて、低解像度の画像に差し替えるので、
本来高解像度のみで描画していた際よりも描画速度が向上します。
ミップマップに使用する画像は本来使用する画像を1/2にした画像を用意し、
距離の段階に分けて切り替えるようにします。
下記の例では「16 × 16」までしか用意していませんが、
最小の画像はで「1 × 1」としています。
●デメリット
・画質の変化
ミップマップを使用した場合、画面に出力される内容が変化します。
通常の出力ではカメラから遠くにあるポリゴンは、画像の内容がある程度分かりますが、
ミップマップを使用した場合、遠くになるほど、画像がぼやけてしまいます。
ミップマップはジャギーをなくす効果があるので、
必ずしもこの画質の変化がデメリットになるというわけではありませんが、
テクスチャフィルタリング次第では画質の向上ではなく、劣化したと見られます。
・使用メモリの増加
縮小サイズ画像用のメモリを必要とします。
必要なメモリ量は画像サイズの約1.3倍と考えられていますので、
速度を優先するのか、メモリの節約を優先するのかの判断が必要です。
■DirectXによるミップマップ
DirectXでは最大サイズの画像を用意するだけでミップマップを使用することが可能です。
●ミップマップ使用方法
①.ミップマップ自動生成の可否チェック
上の説明で自分のPCでミップマップの自動生成を行ってくれるかの
チェックを行います。
※PCでミップマップがサポートされていなかった場合は手動となりますが、
処理負荷のコストが高くなりますので、サポートされていない場合、
ミップマップを使用しないようにしたほうがいいと思います。
1-1.
GetDeviceCapsでデバイス情報を取得して、
そのパラメータにD3DCAPS2_CANAUTOGENMIPMAPのフラグが
立っているかを判断します。
D3DCAPS2_CANAUTOGENMIPMAP:
ミップマップの自動生成をサポートしている
1-2.
次はテクスチャフォーマットを指定して、そのフォーマットでも
自動生成が行われるかを判断します。
以下で設定するディスプレイアダプタや、デバイスのタイプは
初期化時に使用した内容で行います。
CheckDeviceFormat(
ディスプレイアダプタ,
デバイスのタイプ,
ディスプレイのフォーマット,
D3DUSAGE_AUTOGENMIPMAP, // 自動生成を行うか
調査対象, // D3DRTYPE_TEXTURE
テクスチャのフォーマット
);
②.テクスチャー作成時にミップマップレベルを指定する
D3DXCreateTextureFromFileExなどのテクスチャを作成する際に
作成されるミップマップ画像の段階レベルを指定します。
D3DXCreateTextureFromFileExの例:
D3DXCreateTextureFromFileEx(
デバイス、
ファイル名、
横幅、
縦幅、
ミップマップレベル、
...
);
D3DXCreateTextureFromFileExでは第五引数に
ミップマップレベルの指定を行います。
ミップマップレベルは0、またはD3DX_DEFAULTの場合、
最大レベルの指定として扱われ、「1 × 1」までの画像が作成されます。
このレベルはレベルが上がるごとに1/2された画像が作成されます。
例えば「1024 × 1024」の画像でレベル1を指定された場合は
「512 × 512」の画像が作成され、レベル2なら「512 × 512」
「256 × 256」の画像が作成されます。
③.ミップマップの有効化
DIRECT3DDEVICE9のSetSamplerState関数を使用してミップマップの設定を行います。
書式例:
SetSamplerState(サンプラステージ番号,
D3DSAMP_MIPFILTER,
ミップマップの設定);
具体例:
SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
サンプラステージ0番のミップマップを線形補完方式で使用する
※ミップマップは未使用の場合、「D3DTEXF_NONE」を設定します。
D3DTEXF_NONEはデフォルトで設定されています。
④.ミップマップの詳細バイアスの設定
ミップマップの詳細バイアスの設定を行います。
この詳細バイアスのデフォルトは0ですので、0を設定して下さい。
※記事や情報が少ないので確定の内容ではありませんが、
おそらく、この詳細バイアスの値は本来使用されるレベルに対して
加算処理を行っているようです。
詳細バイアスに1を設定した場合、ポリゴンに本来設定するレベルが1なら
レベル2の画像が使用されるようです。
書式例:
SetSamplerState(サンプラステージ番号,
D3DSAMP_MIPMAPLODBIAS,
詳細レベル);
具体例:
SetSamplerState(0, D3DSAMP_MIPMAPLODBIAS, 0);
サンプラステージ0番のミップマップの詳細バイオスは0とする
①はDirectX初期化、②は画像読み込み、③と④は描画処理の際に必要に応じて設定をします。