Platform SDK: DirectX

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

[C++]

ミップマップ チェーンを作成するには、IDirectDraw7::CreateSurface メソッドに渡す DDSURFACEDESC2 構造体の DDSCAPS_MIPMAP および DDSCAPS_COMPLEX フラグを指定する。ミップマップはすべてテクスチャでもあるため、DDSCAPS_TEXTURE フラグを指定する必要もある。

次の例は、IDirectDraw7::CreateSurface メソッドを使用して、サイズ 256x256、128x128、64x64、32x32、および 16x16 の 5 つのミップマップ レベルを作成する方法を示す。

// このコードでは、変数 lpDD は DirectDraw インターフェイスへの
// 有効なポインタであるとする。
 
DDSURFACEDESC2       ddsd; 
LPDIRECTDRAWSURFACE7 lpDDMipMap; 
ZeroMemory(&ddsd, sizeof(ddsd)); 
ddsd.dwSize = sizeof(ddsd); 
ddsd.dwFlags = DDSD_CAPS | DDSD_MIPMAPCOUNT; 
ddsd.dwMipMapCount = 5; 
ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | 
    DDSCAPS_MIPMAP | DDSCAPS_COMPLEX; 
ddsd.dwWidth = 256UL; 
ddsd.dwHeight = 256UL; 
 
ddres = lpDD->CreateSurface(&ddsd, &lpDDMipMap); 
if (FAILED(ddres)) 
. 
. 
. 

ミップマップ レベルの数は省略できる。この場合、IDirectDraw7::CreateSurface はサーフェスのチェーンを作成する。各サーフェスは、直前のサーフェスよりも 2 の累乗ずつ小さくなり、最終的に最小サイズになる。幅と高さも省略できる。この場合、IDirectDraw7::CreateSurface は指定されたレベル数を作成する。このときの最小レベル サイズは 1x1 である。

 :  ミップマップ チェーンの各サーフェスの大きさは、直前のサーフェスの半分になる。最上位ミップマップの大きさが 256エ128 の場合、次のレベルのミップマップの大きさは 128エ64 になり、その次のレベルは 64エ32 という順にミップマップの大きさは小さくなり、最終的には 2×1 になる。dwWidth および dwHeight メンバに明示的に大きさを指定した場合は、いくつかの制約がある。つまり、dwMipMapCount でミップマップ レベルの数を指定することはできない。dwMipMapCount では、チェーンのミップマップの幅または高さのいずれかを 1 より小さくなることがある。例として、4×2 の最上位ミップマップ サーフェスの場合を考える。この場合、dwMipMapCount に指定可能な最大値は 2 である。最上位の大きさは 4エ2 で、次のレベルの大きさは 2エ1 である。dwMipMapCount の値が 2 より大きいと、第 2 レベルのミップマップの高さは分数になる。したがって、これは許可されない。

[Visual Basic]

ミップマップ チェーンを作成するには、DirectDraw7.CreateSurface メソッドに渡す DDSURFACEDESC2 型の DDSCAPS_MIPMAP および DDSCAPS_COMPLEX フラグを指定する。ミップマップはすべてテクスチャでもあるため、DDSCAPS_TEXTURE フラグを指定する必要もある。

次の例は、DirectDraw7.CreateSurface メソッドを使用して、サイズ 256x256、128x128、64x64、32x32、および 16x16 の 5 つのミップマップ レベルを作成する方法を示す。

' このコードでは、変数 DD に DirectDraw7 オブジェクトへの
' 有効な参照が格納されているとする。
On Local Error Resume Next
Dim ddsd As DDSURFACEDESC2
Dim DDMipMap As DirectDrawSurface7

ddsd.lFlags = DDSD_CAPS Or DDSD_MIPMAPCOUNT
ddsd.lMipMapCount = 5
ddsd.ddsCaps.lCaps = DDSCAPS_TEXTURE Or DDSCAPS_MIPMAP Or DDSCAPS_COMPLEX
ddsd.lWidth = 256
ddsd.lHeight = 256
 
Set DDMipMap = DD.CreateSurface(ddsd)
If Err.Number <> DD_OK Then
' エラー処理コード
End If

ミップマップ レベルの数は省略できる。この場合、DirectDraw7.CreateSurface はサーフェスのチェーンを作成する。各サーフェスは、直前のサーフェスよりも 2 の累乗ずつ小さくなり、最終的に最小サイズになる。幅と高さも省略できる。この場合、DirectDraw7.CreateSurface は指定されたレベル数を作成する。このときの最小レベル サイズは 1x1 である。

 :  ミップマップ チェーンの各サーフェスの大きさは、直前のサーフェスの半分になる。最上位ミップマップの大きさが 256エ128 の場合、次のレベルのミップマップの大きさは 128エ64 になり、その次のレベルは 64エ32 という順にミップマップの大きさは小さくなり、最終的には 2×1 になる。lWidth および lHeight メンバに明示的に大きさを指定した場合は、いくつかの制約がある。つまり、lMipMapCount でミップマップ レベルの数を指定することはできない。lMipMapCount では、チェーンのミップマップの幅または高さのいずれかを 1 より小さくなることがある。例として、4×2 の最上位ミップマップ サーフェスの場合を考える。この場合、lMipMapCount に指定可能な最大値は 2 である。最上位の大きさは 4エ2 で、次のレベルの大きさは 2エ1 である。lMipMapCount の値が 2 より大きいと、第 2 レベルのミップマップの高さは分数になる。したがって、これは許可されない。