다음을 통해 공유


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

Mipmap이란 순차적으로 이어지는 텍스처로서 각각 동일한 이미지의 해상도가 점차 낮아지면서 표현됩니다. mipmap에서 각 이미지 또는 수준의 높이와 너비는 이전 수준보다 작은 2의 힘입니다. Mipmap이 사각형일 필요는 없습니다.

고해상도의 Mipmap 이미지는 사용자와 가까운 개체에 사용됩니다. 저해상도의 이미지는 멀리 보이는 개체에 사용됩니다. Mipmap을 사용하면 메모리 사용량이 늘어나지만 렌더링되는 텍스처의 품질이 향상됩니다.

Direct3D는 연쇄적으로 연결된 표면 사슬로 Mipmap을 표현합니다. 가장 높은 해상도의 텍스처가 사슬의 전면에 위치하고 연쇄적으로 다음 수준의 Mipmap이 연결됩니다. 이후에도 다음 수준의 텍스처가 연쇄적으로 연결되어 가장 낮은 해상도의 Mipmap까지 이어집니다.

다음 그림은 이러한 수준의 예를 나타냅니다. 비트맵 텍스처가 3D 1인칭 게임에서 컨테이너의 기호를 표현합니다. 이것을 Minimap으로 생성하면 가장 높은 해상도의 텍스처가 제일 먼저 나타납니다. 이후 Mipmap 집합에서 텍스처가 이어질 때마다 높이와 너비가 2의 제곱씩 작아집니다. 이 경우 최대 해상도의 Mipmap은 256x256 픽셀입니다. 다음은 128x128입니다. 연쇄 사슬에서 마지막 텍스처는 64x64입니다.

이 기호는 최대 가시 거리일 때의 모습입니다. 사용자가 기호에서 멀어지기 시작하면 게임은 Mipmap 사슬에서 가장 작은 텍스처를 표시하며, 여기에서는 64x64 텍스처입니다.

위험 기호의 64x64 텍스처 그림

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

위험 기호의 128x128 텍스처 그림

사용자의 시점이 기호까지 초소 허용 거리에 도달하면 다음 그림과 같이 가장 높은 해상도의 텍스처가 사용됩니다.

위험 기호의 256x256 텍스처 그림

이는 텍스처의 원근감을 더욱 효율적으로 시뮬레이션할 수 있는 방법입니다. 단일 텍스처를 여러 해상도로 렌더링하기 보다는 각기 다른 해상도에서 다수의 텍스처를 사용하는 것이 더욱 빠릅니다.

Direct3D는 Mipmap 집합에서 원하는 출력에 가장 가까운 해상도인 텍스처를 평가한 후 픽셀을 해당하는 텍셀 공간으로 매핑합니다. 최종 이미지의 해상도가 Mipmap 집합의 두 텍스처 해상도 사이라면 Direct3D가 두 Mipmap의 텍셀을 검사하여 색상 값을 혼합합니다.

Mipmap을 사용하려면 애플리케이션이 Mipmap 세트를 생성해야 합니다. 애플리케이션은 현재 텍스처 집합에서 Mipmap 집합을 첫 번째 텍스처로 선택하여 Mipmap을 적용합니다. 자세한 내용은 텍스처 혼합(Direct3D 9)을 참조하세요.

그런 다음 애플리케이션이 Direct3D가 텍셀 샘플링에 사용할 필터링 방법을 설정해야 합니다. 가장 빠른 Mipmap 필터링 방법은 Direct3D가 가장 가까운 텍셀을 선택하도록 하는 것입니다. D3DTEXF_POINT 열거형 값을 사용하여 이 방법을 선택하세요. 애플리케이션이 D3DTEXF_LINEAR 열거형 값을 사용하는 경우에는 Direct3D의 필터링 결과가 더 나아질 수 있습니다. 가장 가까운 Mipmap을 선택한 후 텍스처에서 현재 픽셀이 매핑되는 위치를 중심으로 텍셀의 가중 평균을 계산하기 때문입니다.

Mipmap 텍스처는 렌더링 시간을 줄일 목적으로 3D 장면에 사용됩니다. 또한 장면의 현실감을 높이기도 합니다. 단, 종종 많은 양의 메모리가 필요합니다.

Mipmap 집합 만들기

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

// 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 체인의 각 표면에는 체인의 이전 표면의 절반에 해당되는 크기가 있습니다. 예를 들어 최상위 Mipmap의 크기가 256x128이라면, 두 번째 Mipmap의 크기가 128x64이고, 세 번째가 64x32인 식으로 이어져 1x1까지 계속 됩니다. 수준에서 다수의 Mipmap 수준을 요청할 수는 없습니다. 사슬의 Mipmap 너비 또는 높이가 1보다 작아질 수도 있기 때문입니다. 쉽게 말해서 최상위 Mipmap 표면의 크기가 4x2라면 수준에서 허용되는 최대 값은 3입니다. 최상위 크기가 4x2이면, 두 번째는 2x1이고, 세 번째는 1x1이 됩니다. 수준에서 값을 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의 수준 수를 검색할 수 있습니다.

텍스처 필터링