Platform SDK: DirectX |
ミップマップ チェーンを作成するには、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 レベルのミップマップの高さは分数になる。したがって、これは許可されない。
ミップマップ チェーンを作成するには、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 レベルのミップマップの高さは分数になる。したがって、これは許可されない。