DirectX Graphics 프로그래밍 가이드 고정 기능 파이프라인 텍스처 텍스처 필터링 밉맵에 의한 텍스처 필터링   [목차열람] [주소복사] [슬롯비우기]
밉맵에 의한 텍스처 필터링
 
Microsoft DirectX 9.0

밉맵에 의한 텍스처 필터링


밉맵과는 연속한 텍스처로, 각 텍스처는 같은 화면을 서서히 저해상도로 한 것이다. 밉맵에서의 각 화면의 높이와 폭, 즉 레벨은, 직전의 레벨보다 2 의 거듭제곱만 작다. 밉맵은 정방형일 필요는 없다.

사용자에 가까운 개체에는, 고해상도 밉맵 화면이 사용된다. 개체가 멀어지는에 따라, 저해상도의 밉맵 화면이 사용된다. 밉맵 처리에 의해, 렌더링 한 텍스처의 품질이 향상하지만, 사용하는 메모리는 증가한다.

Microsoft® Direct3D® 에서는, 밉맵은 Attach 된 표면의 체인으로서 나타낸다. 이 체인의 선두에는 최고 해상도의 텍스처가 있어, 그 후에는 다음의 밉맵 레벨의 텍스처가 계속된다. 이 레벨의 뒤에는 다음의 레벨의 밉맵이 계속된다, 라고 하는 순으로 최저 해상도의 밉맵이 될 때까지 계속되어 간다.

다음 그림은 이러한 레벨의 예를 나타내고 있다. 비트 맵 텍스처는, 일인칭형의 게임의 3D 컨테이너의 측면에 있는 기호를 나타내고 있다. 밉맵으로서 생성 하면, 최고 해상도의 텍스처가 이 세트의 선두에 온다. 이 밉맵 세트가 연속하는 각 텍스처는, 높이와 폭이 2 의 거듭제곱씩 작게 되어 간다. 이 경우, 최고 해상도의 밉맵은 256 × 256 픽셀이다. 다음의 텍스처는 128 × 128 이다. 마지막 텍스처는 64 × 64 이다.

이 기호는 가시 범위로부터의 최대 거리에 있다. 이 기호로부터 멀게 멀어진 위치로부터 게임을 시작 하는 경우, 밉맵 체인 중(안)에서 최소의 텍스처 (이 경우 64 × 64 의 텍스처)가 표시된다.

위험을 나타내는 기호

사용자의 시점이 이 기호에 가까워지는 것에 따라, 서서히 고해상도의 텍스처가 사용된다. 다음의 그림의 해상도는 128 × 128 이다.

위험을 나타내는 기호

최고 해상도의 텍스처가 사용되는 것은, player의 시점이 이 기호에 가장 가까워졌을 때이다.

위험을 나타내는 기호

이것은, 텍스처의 보이는 방법을 시뮬레이트 하는 방법 중(안)에서는 효율적인 방법이다. 1 개의 텍스처를 많은 해상도로 렌더링 하는 것보다도, 다양한 해상도로 복수의 텍스처를 사용하는 쪽이 고속으로 있다.

Direct3D 에서는, 밉맵 세트 중(안)에서 어느 텍스처가 가장 목적 출력에 가까운 해상도인지를 평가해, 픽셀을 그 텍셀 공간에 맵핑 할 수 있다. 최종적인 화면의 해상도가 밉맵 세트내의 텍스처간에 있는 경우, Direct3D 에서는 양쪽 모두의 밉맵의 텍셀을 조사해 그 색값을 블렌드 한다.

밉맵을 사용하려면 , 애플리케이션으로 밉맵세트를 생성 할 필요가 있다. 애플리케이션에서는, 밉맵 세트를 현재 텍스처 세트의 최초의 텍스처로서 선택해, 밉맵을 적용한다. 더 자세한 정보는, 「텍스처 혼합」을 참조할것.

다음에, Direct3D 로 텍셀의 샘플링에 사용하는 필터링 방법을 설정해야 한다. 가장 처리가 빠른 밉맵 필터링은, Direct3D 로 가장 가까운 텍셀을 선택하는 방법이다. 이것 선택하려면 , D3DTEXF_POINT 열거값을 사용한다. Direct3D 에서는, D3DTEXF_LINEAR 열거값을 사용 하면, 보다 고품질인 필터링 결과를 얻을 수 있다. 이 필터링에서는, 가장 가까운 밉맵이 선택되어 다음에 현재의 픽셀이 맵핑 되는 텍스처내의 위치 좌표의 주변 텍셀의 가중평균을 계산한다.

밉맵 텍스처는, 장면(scene)의 렌더링에 필요한 시간을 단축하기 위해서 3D 장면으로 사용된다. 또, 밉맵 텍스처를 사용하면 장면(scene)의 리얼리티가 늘어난다. 그러나, 밉맵 텍스처를 사용하려면 메모리가 대량으로 필요한 것이 많다.

밉맵 세트의 생성

다음 예는IDirect3DDevice9::CreateTexture 메서드를 호출해, 256 × 256, 128 × 128, 64 × 64, 32 × 32, 16 × 16 의 5 단계의 밉맵 레벨을 구축한다.

// This code example assumes that the variable d3dDevice is a
// valid pointer to a IDirect3DDevice9 interface.

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

IDirect3DDevice9::CreateTexture 가 받는 최초의 2 개의 인수는, 최상정도 텍스처의 사이즈와 폭이다. 제 3 인수에는, 텍스처의 레벨수를 지정한다. 이 인수를 제로로 설정 하면, Direct3D 는 표면의 체인을 생성 한다. 각 표면은, 직전의 표면보다 2 의 거듭제곱 1 개분씩 작아져, 최종적으로 1 × 1 의 최소 사이즈가 된다. 제 4 인수에는, 이 리소스의 사용 방법을 지정한다. 여기에서는 제로가 지정되고 있으므로, 리소스에는 특정의 사용 방법은 없는 것을 나타낸다. 제 5 인수에는, 텍스처의 표면 포맷을 지정한다. 이 인수에는,D3DFORMAT 열거형의 값을 사용한다. 제 6 인수에는, 생성 한 리소스를 배치하는 메모리 클래스를 나타내는 D3DPOOL 열거형의 멤버를 지정한다. 동적 텍스처를 사용하고 있으므로 않으면, D3DPOOL_MANAGED 를 권한다. 마지막 인수는,IDirect3DTexture9 인터페이스의 포인터 주소로 한다.

  밉맵 체인의 각 표면의 크기는, 직전의 표면의 반이 된다. 최상정도 밉맵의 크기가 256 × 128 의 경우, 2 번째의 레벨의 밉맵의 크기는 128 × 64 가 되어, 3 번째의 레벨은 64 × 32 라고 하는 순으로 밉맵의 크기는 작아져, 최종적으로는 1 × 1 이 된다. Levels 에서는, 체인의 밉맵의 폭 또는 높이중 한쪽이 1 보다 작아지는 것 같은 밉맵 레벨수를 지정할 수 없다. 간단한 예를 나타내면 최상정도의 밉맵 표면이 4 × 2 의 경우,Levels 의 최대치는 3 이다. 최상정도 레벨의 크기가 4 × 2 인 경우, 2 번째의 레벨은 2 × 1, 3 번째의 레벨은 1 × 1 이 된다. Levels 의 값이 3 보다 큰 경우, 제 2 레벨의 밉맵으로 높이는 분수가 된다. 따라서, 이것은 허가되지 않는다.

밉맵의 선택과 표시

IDirect3DDevice9::SetTexture 메서드를 호출해, 현재 텍스처의 일람내의 선두의 텍스처로서 밉맵 텍스처를 설정한다. 더 자세한 정보는, 「텍스처 혼합」을 참조할것.

밉맵 텍스처 세트를 선택한 후,D3DTEXTUREFILTERTYPE 열거형으로부터의 값을 D3DSAMP_MIPFILTER 샘플러 스테이트에 할당해야 한다. 이것에 의해, Direct3D 는 밉맵 텍스처 필터링을 자동적으로 실행한다. 다음 샘플 코드에서는, 밉맵 텍스처 필터링이 유효하게 되고 있다.

d3dDevice->SetTexture(0, pMipMap);
d3dDevice->SetTextureStageState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);

또,IDirect3DTexture9::GetSurfaceLevel 메서드를 사용해, 얻어온다 밉맵 레벨을 지정하는 것으로, 밉맵 표면의 체인을 수동으로 암벽 횡단 할 수 있다. 다음의 예에서는, 최고 해상도로부터 최저 해상도까지 밉맵 체인을 암벽 횡단 한다.

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

체인의 밉맵 표면의 각 표면에 비트 맵 데이터를 로드하기 위해서(때문에), 애플리케이션에서는 밉맵 체인을 수동으로 암벽 횡단 할 필요가 있다. 보통, 이 이유로부터 체인을 암벽 횡단 한다. 애플리케이션은,IDirect3DBaseTexture9::GetLevelCount 를 호출해, 밉맵에 저장 되고 있는 레벨의 수를 취득할 수 있다.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP