Mipmap을 사용한 텍스처 필터링(Direct3D 9)

Mipmap은 텍스처 시퀀스이며, 각 텍스처는 동일한 이미지의 해상도가 점진적으로 낮은 표현입니다. mipmap에서 각 이미지 또는 레벨의 높이와 너비는 이전 레벨보다 2의 거듭제곱만큼 작습니다. 밉맵은 정사각형일 필요가 없습니다.

고해상도 Mipmap 이미지는 사용자와 가까운 개체에 사용됩니다. 개체가 더 멀리 표시되면 해상도가 낮은 이미지가 사용됩니다. Mipmapping은 더 많은 메모리를 사용하지 않고 렌더링된 텍스처의 품질을 향상시킵니다.

Direct3D는 밉맵을 연결된 표면의 체인으로 나타냅니다. 가장 높은 해상도의 텍스처는 체인의 헤드에 있으며 다음 수준의 Mipmap을 첨부 파일로 사용합니다. 따라서 해당 수준에는 mipmap의 다음 수준인 첨부 파일이 있으며, 밉맵의 가장 낮은 해상도 수준까지 내려갈 수 있습니다.

다음 그림에서는 이러한 수준의 예를 보여 줍니다. 비트맵 텍스처는 3D 1인칭 게임의 컨테이너에 대한 기호를 나타냅니다. Mipmap으로 만들면 가장 높은 해상도의 텍스처가 집합의 첫 번째 텍스처입니다. Mipmap 집합의 각 다음 텍스처는 높이와 너비가 2의 거듭제곱에 의해 작아집니다. 이 경우 최대 해상도 밉맵은 256픽셀 x 256픽셀입니다. 다음으로 텍스처는 128x128입니다. 체인의 마지막 질감은 64x64입니다.

이 기호는 표시되는 최대 거리를 가집니다. 사용자가 표지판에서 멀리 떨어져 시작할 경우, 게임은 Mipmap 체인에서 가장 작은 텍스처를 표시하며, 이 경우 64x64 텍스처입니다.

64x64 질감의 위험 기호그림

사용자가 보기 지점을 기호에 더 가깝게 이동하면 Mipmap 체인에서 점진적으로 고해상도 텍스처가 사용됩니다. 다음 그림의 해상도는 128x128입니다.

위험 기호의 128x128 텍스처 일러스트 ()

가장 높은 해상도의 텍스처는 다음 그림과 같이 사용자의 관점이 기호에서 허용되는 최소 거리일 때 사용됩니다.

위험 기호의 256x256 질감의 그림

이는 텍스처에 대한 원근법을 시뮬레이션하는 더욱 효율적인 방법입니다. 여러 해상도에서 단일 텍스처를 렌더링하는 대신 다양한 해상도에서 여러 텍스처를 사용하는 것이 더 빠릅니다.

Direct3D는 원하는 출력에 가장 가까운 해상도인 Mipmap 집합의 질감을 평가할 수 있으며 픽셀을 텍셀 공간에 매핑할 수 있습니다. 최종 이미지의 해상도가 Mipmap 집합의 텍스처 해상도 사이에 있는 경우 Direct3D는 두 밉맵에서 텍셀을 검사하고 색상 값을 함께 혼합할 수 있습니다.

Mipmap을 사용하려면 애플리케이션이 밉맵 집합을 빌드해야 합니다. 애플리케이션은 현재 텍스처 집합의 첫 번째 텍스처로 Mipmap 집합을 선택하여 Mipmap을 적용합니다. 자세한 내용은 텍스처 블렌딩(Direct3D 9)참조하세요.

다음으로, 애플리케이션은 Direct3D에서 텍셀 샘플링에 사용하는 필터링 방법을 설정해야 합니다. Mipmap 필터링의 가장 빠른 방법은 Direct3D가 가장 가까운 텍셀을 선택하도록 하는 것입니다. D3DTEXF_POINT 열거형 값을 사용하여 이를 선택하십시오. 애플리케이션에서 D3DTEXF_LINEAR 열거 값을 사용하는 경우 Direct3D는 더 나은 필터링 결과를 생성할 수 있습니다. 가장 가까운 밉맵을 선택한 다음 현재 픽셀이 매핑되는 텍스처의 위치를 둘러싼 텍셀의 가중 평균을 계산합니다.

Mipmap 텍스처는 장면을 렌더링하는 데 필요한 시간을 줄이기 위해 3D 장면에서 사용됩니다. 또한 장면의 리얼리즘을 향상시킵니다. 그러나 대개 많은 양의 메모리가 필요합니다.

Mipmap 세트 생성하기

다음 예제에서는 애플리케이션이 IDirect3DDevice9::CreateTexture 메서드를 호출하여 256x256, 128x128, 64x64, 32x32 및 16x16의 5개의 mipmap 수준 체인을 빌드하는 방법을 보여 줍니다.

// This code example assumes that m_d3dDevice is a
// valid pointer to a IDirect3DDevice9 interface

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

IDirect3DDevice9::CreateTexture 허용되는 처음 두 매개 변수는 최상위 텍스처의 크기와 너비입니다. 세 번째 매개 변수는 텍스처의 수준 수를 지정합니다. 이 값을 0으로 설정하면 Direct3D는 표면 체인을 만듭니다. 각 표면은 이전보다 두 개 더 작은 1x1의 가장 작은 크기로 축소됩니다. 네 번째 매개 변수는 이 리소스의 사용을 지정합니다. 이 경우, 리소스에 대한 특정 용도가 없음을 나타내기 위해 0이 지정됩니다. 다섯 번째 매개 변수는 텍스처의 표면 형식을 지정합니다. 이 매개 변수에 대해 D3DFORMAT 열거 형식의 값을 사용합니다. 여섯 번째 매개 변수는 생성된 리소스를 배치할 메모리 클래스를 나타내는 D3DPOOL 열거형 형식의 멤버를 지정합니다. 동적 텍스처를 사용하지 않는 한 D3DPOOL_MANAGED 것이 좋습니다. 마지막 매개 변수는 포인터의 주소를 IDirect3DTexture9 인터페이스로 이동합니다.

참고

Mipmap 체인의 각 표면에는 체인의 이전 표면의 절반에 해당되는 크기가 있습니다. 최상위 밉맵의 크기가 256x128인 경우 두 번째 수준 Mipmap의 차원은 128x64이고, 세 번째 수준은 64x32이고, 1x1까지 내려갔습니다. 체인에 있는 Mipmap의 너비 또는 높이가 1보다 작게 만드는 수준에서는 여러 밉맵 수준을 요청할 수 없습니다. 4x2 최상위 밉맵 표면의 간단한 경우 레벨에 허용되는 최대값은 3입니다. 최상위 차원은 4x2이고, 두 번째 수준 차원은 2x1이고, 세 번째 수준의 차원은 1x1입니다. Level의 값이 3보다 크면 두 번째 수준 mipmap의 높이에서 소수 값이 생성되므로 허용되지 않습니다.

 

Mipmap 선택 및 표시

IDirect3DDevice9::SetTexture 메서드를 호출하여 mipmap 텍스처 집합을 현재 텍스처 목록의 첫 번째 텍스처로 설정합니다. 자세한 내용은 텍스처 블렌딩(Direct3D 9)참조하세요.

애플리케이션이 mipmap 텍스처 집합을 선택한 후 D3DTEXTUREFILTERTYPE 열거형 형식의 값을 D3DSAMP_MIPFILTER 샘플러 상태로 할당해야 합니다. 그런 다음 Direct3D는 Mipmap 텍스처 필터링을 자동으로 수행합니다. Mipmap 텍스처 필터링을 사용하도록 설정하는 방법은 다음 코드 예제에 설명되어 있습니다.

m_pD3DDevice->SetTexture(0, pMipMap);
m_pD3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

또한 애플리케이션은 IDirect3DTexture9::GetSurfaceLevel 메서드를 사용하고 검색할 mipmap 수준을 지정하여 mipmap 표면 체인을 수동으로 트래버스할 수 있습니다. 다음 예제에서는 가장 높은 해상도에서 가장 낮은 해상도로 Mipmap 체인을 트래버스합니다.

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

애플리케이션은 수동으로 mipmap 체인을 트래버스하여 비트맵 데이터를 체인의 각 표면에 로드해야 합니다. 일반적으로 체인을 트래버스하는 유일한 이유입니다. 애플리케이션은 IDirect3DBaseTexture9::GetLevelCount호출하여 mipmap의 수준 수를 검색할 수 있습니다.

텍스처 필터링