밉맵 필터링

반응형
밉맵 (mipmap) 은 텍스처 집합으로, 각 텍스처는 동일한 이미지에 대해 점진적으로 낮은 해상도를 가지며, 각 이미지의 높이와 너비 (혹은 레벨) 는 이전 레벨보다 2의 거듭제곱만큼 작다. 하지만 반드시 제곱이어야 하는건 아니다. 고해상도 밉맵 이미지는 유저에게 가까운 개체, 저해상도 밉맵 이미지는 멀리 있는 개체에 사용되며, 이는 보다 많은 메모리를 사용해 렌더링된 텍스처의 질을 높이는 방식이다.

    D3D는 밉맵을 덧붙여진 표면들의 체인으로 표현한다. 즉 가장 높은 해상도의 텍스처가 맨 처음에 위치하며 가장 낮은 해상도의 텍스처가 맨 마지막에 위치한다. 다음 비트맵 텍스처는 3D 1인칭 게임에서 컨테이너 표지를 나타낸다. 이 텍스처가 밉맵으로 만들어지면, 텍스처는 해상도 순으로 위치하며, 각 텍스처의 높이와 너비는 2의 제곱만큼의 차이를 갖는다. 여기에서 밉맵은 각각 64×64, 128×128, 256×256다.

이 표지를 볼 수 있는 최대 거리에 있을 때의 텍스처로, 아래의 해상도는 64×64다:


유저의 시점이 표지에 가까워지면, 점진적으로 고해상도의 텍스처가 사용되며, 아래의 해상도는 128×128이다:

이 표지를 볼 수 있는 최소 거리에 있을 때의 텍스처로, 가장 높은 해상도의 텍스처가 사용된다:

    이 방식은 텍스처의 원근을 시뮬레이션하는 가장 효과적인 방법인데, 1개의 텍스처를 다양한 해상도에서 렌더링하는 것보다, 이처럼 여러 개의 텍스처를 다양한 해상도에서 사용하는게 더 빠르기 때문이다. D3D는 밉맵 집합 중 어떤 텍스처가 원하는 결과에 가장 가까운 해상도인지 평가하고, 그 텍셀 공간에 픽셀들을 매핑할 수 있다. 최종 이미지의 해상도를 가진 텍스처가 밉맵 집합에 있다면, D3D는 두 밉맵 내의 텍셀들을 검사하고 그들의 색상을 섞을 수 있다.

    밉맵을 사용하려면 우선 밉맵 집합을 만들어야 하는데, 이는 현재 텍스처 집합의 첫번째 텍스처를 밉맵 집합으로 선택하면 된다. 세부사항은 Texture Blending을 참조한다. 다음으로 텍셀을 샘플링하는데 사용할 필터링 방법을 선택한다. 가장 빠른 밉맵 필터링 방법은 근접점 샘플링으로, D3DTEXF_POINT를 사용한다. 좀 더 나은 결과를 얻으려면, D3DTEXF_LINEAR를 사용한다.

    밉맵 텍스처는 scene 렌더링 시간을 줄이기 위해 3D scene에서도 사용되는데, 이는 scene의 현실성도 높일 수 있다. 하지만 보통 더 많은 메모리가 필요하다.

 

밉맵 집합 생성

 

    다음 예제는 IDirect3DDevice9::CreateTexture 메서드를 사용해서 5 레벨의 밉맵 체인─256×256, 128×128, 64×64, 32×32, 16×16─을 만든다.

//m_pD3DDevice는 IDirect3DDevice9 인터페이스에 대한 유효한 포인터라고 가정

 

IDirect3DTexture9 * pMipMap;

m_pD3DDevice->CreateTexture(256, 256, 5, 0, D3DFMT_R8G8B8,

    D3DPOOL_MANAGED, &pMipMap);

처음 2개의 매개변수는 1단계 텍스처의 크기와 너비, 3번째 매개변수는 텍스처 내 레벨의 수─0이면, D3D는 가장 작은 크기인 1×1까지 2의 거듭제곱만큼의 차이로 표면들의 체인을 만든다─다. 4번째와 5번째 매개변수는 각각 이 리소스의 사용법─0이면, 특별한 방법을 지정하지 않는다─ 및 텍스처의 표면 포맷─D3DFORMAT 열거형의 값─이다. 6번째 매개변수는 생성된 리소스를 위치시킬 메모리 클래스를 가리키는 D3DPOOL 열거형 값이다. 동적 텍스처를 사용한다면, D3DPOOL_MANAGED가 적절하다. 마지막 매개변수는 IDirect3DTexture9 인터페이스에 대한 포인터의 주소다.

 

참고    밉맵 체인 내 각 표면의 차원은 이전 표면의 절반이다. 즉 1단계 밉맵이 256×128이라면, 뒤따르는 밉맵은 각각 128×64, 64×32, ..., 1×1이다. 또한 밉맵의 너비 또는 높이가 1보다 작은 레벨은 있을 수 없다. 즉 1단계 밉맵 표면이 4×2라면, 뒤따르는 밉맵은 각각 2×1, 1×1로 총 레벨의 수는 3개까지다.

 

밉맵 선택과 표시

 

    밉맵 텍스처 집합을 현재 텍스처 목록의 첫번째 텍스처로 설정하려면 IDirect3DDevice9::SetTexture 메서드를 사용한다. 세부사항은 Texture Blending을 참고한다.

    밉맵 텍스처 집합을 선택한 후, 값들을 D3DTEXTUREFILTERTYPE 열거형의 D3DSAMP_MIPFILTER로 할당해야 한다. 그러면 D3D는 자동으로 밉맵 텍스처 필터링을 수행한다.

m_pD3DDevice->SetTexture(0, pMipMap);

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

아니면 IDirect3DTexture9::GetSurfaceLevel 메서드를 사용하고 반환할 밉맵 레벨을 지정함으로써 직접 밉맵 표면 체인을 traverse할 수도 있다. 아래 코드는 높은 해상도 순으로 밉맵 체인을 traverse한다.

IDirect3DSurface9 * pSurfaceLevel;

for (int iLevel = 0; iLevel < pMipMap->GetLevelCount(); iLevel++)

{

    pMipMap->GetSurfaceLevel(iLevel, &pSurfaceLevel);

    // 레벨 처리

    pSurfaceLevel->Release();

}

비트맵 데이터를 체인의 각 표면으로 로드하려면 직접 밉맵 체인을 traverse해야 한다. 이것이 전형적으로 체인을 traverse하는 유일한 이유다. 밉맵의 레벨 수를 반환하려면 IDirect3DBaseTexture9::GetLevelCount를 사용한다.

 

[원문: msdn, Texture Filtering with Mipmaps]


'Study > Directx 9' 카테고리의 다른 글

D3DXMatrixLookAtLH  (0) 2009.10.26
알파블렌드와 알파테스트  (0) 2009.09.02
알파 메쉬 랜더링 - 참고자료  (0) 2009.09.02
dx 텍스쳐 저장  (0) 2009.07.13
텍스쳐 렌더링  (0) 2009.06.26
TAGS.

Comments