Nearest-Point 샘플링(Direct3D 9)

응용 프로그램에서는 텍스처 필터링을 사용하지 않아도 됩니다. Direct3D가 텍셀 주소를 계산하도록 설정할 수 있습니다. 이렇게 하면 값을 정수로 평가하지 않는 경우가 많고, 텍셀의 색을 가장 가까운 정수 주소로 복사합니다. 이러한 프로세스를 근접점 샘플링이라고 합니다. 이는 텍스처의 크기가 화면의 기본 이미지 크기와 유사한 경우 텍스처를 처리하는 빠르고 효율적인 방법이 될 수 있습니다. 그렇지 않은 경우, 텍스처를 확대하거나 축소해야 합니다. 결과는 두툼하거나, 별칭이 지정되거나, 흐린 이미지일 수 있습니다.

C++ 애플리케이션은 IDirect3DDevice9::SetSamplerState 메서드를 호출하여 가장 가까운 지점 샘플링을 선택할 수 있습니다. 첫 번째 매개 변수의 값을 텍스처 필터링 메서드를 선택하는 텍스처의 정수 인덱스 번호(0-7)로 설정합니다. 두 번째 매개 변수에 대한 D3DSAMP_MAGFILTER, D3DSAMP_MINFILTER 또는 D3DSAMP_MIPFILTER 전달하여 확대, 축소 또는 mipmapping 필터를 설정합니다. 세 번째 매개 변수에 D3DTEXF_POINT 전달합니다.

텍스처가 두 텍셀 사이의 경계에서 샘플링될 때 그래픽 아티팩트가 발생할 수 있으므로 가장 가까운 지점 샘플링을 신중하게 사용해야 합니다. 텍스처(u 또는 v)를 따라 나 있는 이 경계에서 샘플링된 텍셀이 한 텍셀에서 다음 텍셀로 전환합니다. 점 샘플링을 사용하면 시스템이 샘플 텍셀을 이것저것 선택하는데, 경계를 넘나들므로 그 결과는 한 텍셀에서 다음 텍셀로 갑자기 변할 수 있습니다. 이러한 효과는 표시된 텍스처에서 이미지 상의 불필요한 부분으로 예기치 않게 나타날 수 있습니다. 선형 필터링을 사용하는 경우, 인접한 두 텍셀을 계산하여 그 결과로 얻은 텍셀은 텍스처 인덱스가 경계를 통과할 때 두 텍셀과 매끄럽게 혼합됩니다.

이 효과는 아주 큰 다각형에 아주 작은 텍스처를 매핑할 때 볼 수 있는데, 이 작업을 '확대'라고 합니다. 예를 들어 체스판 모양의 텍스처를 사용하면 근접점 샘플링은 가장자리가 뚜렷이 표시되는 큰 체스판 모양을 만듭니다. 이와 대조적으로, 선형 텍스처 필터링은 체스판 색이 다각형 전체에 걸쳐 매끄럽게 변화하는 이미지를 만듭니다.

대부분의 경우 응용 프로그램은 가능한 한 근접점 샘플링을 피하여 최상의 결과를 얻습니다. 오늘날 대부분의 하드웨어는 선형 필터링에 최적화되어 있으므로 응용 프로그램이 성능 저하를 겪지 않습니다. 텍스처를 사용하여 읽을 수 있는 텍스트 문자를 표시하는 것과 같이 원하는 효과를 얻기 위해 근접점 샘플링이 필요한 경우, 예기치 않은 효과를 가져올 수 있는 텍셀 경계 샘플링이 응용 프로그램에서 발생하지 않도록 방지하기 위해 각별히 주의해야 합니다. 다음 일러스트레이션은 이러한 이미지 상 불필요한 부분의 예를 보여줍니다.

오른쪽 위 두 사각형에 연속되지 않은 가로줄이 있는 6개 구역 상자 그림

그룹의 오른쪽 위에 있는 두 사각형은 인접한 사각형과 다르게 표시되며 대각선 오프셋이 실행됩니다. 이와 같은 이미지 상 불필요한 부분을 방지하려면 근접점 필터링에 관한 Direct3D 텍스처 샘플링 규칙을 잘 알고 있어야 합니다. Direct3D는 [0.0, 1.0](0.0부터 1.0까지) 범위의 부동 소수점 텍스처 좌표를 [-0.5, n -0.5] 범위의 정수 텍셀 공간에 매핑합니다. 여기에서 n은 텍스처에서 지정된 차원의 텍셀 개수입니다. 그 결과 얻게 되는 텍스처 인덱스는 근사치의 정수로 반올림됩니다. 이 매핑은 텍셀 경계에서 샘플링 오류를 유발할 수 있습니다.

간단한 예제에서는 D3DTADDRESS_WRAP 텍스처 주소 지정 모드로 다각형을 렌더링하는 애플리케이션을 상상해 보세요. u 텍스처 인덱스는 Direct3D가 사용하는 매핑을 사용하여, 너비가 텍셀 4개에 해당하는 텍스처를 나타내는 다음 다이어그램에 표시된 것처럼 매핑합니다.

텍셀 사이의 경계에서 텍스처 좌표 0.0 및 1.0 다이어그램

이 그림의 텍스처 좌표 0.0과 1.0은 정확히 텍셀 사이의 경계에 있습니다. Direct3D가 값을 매핑하는 데 사용하는 메서드를 사용하는 이 텍스처 좌표는 [-0.5, 4 -0.5]의 범위에 있으며, 여기에서 4는 텍스처의 너비입니다. 이 경우 샘플링된 텍셀은 1.0의 텍스처 인덱스에 대해 0 텍셀입니다. 그러나 텍스처 좌표가 1.0보다 약간 작은 경우, 샘플링된 텍셀은 0 텍셀이 아닌 n 텍셀일 것입니다.

이는 화면-공간 정렬 삼각형에서 근접점 필터링으로 정확하게 0.0 및 1.0의 텍스처 좌표를 사용하여 작은 텍스처를 확대하면 텍스처 맵이 텍셀 사이 경계에서 샘플링되는 픽셀이 생긴다는 것을 뜻합니다. 텍스처 좌표 계산 오류는 아무리 작은 것이라 하더라도 텍스처 맵의 텍셀 가장자리에 해당하는 렌더링 이미지의 영역을 따라 불필요한 부분을 발생시킵니다.

부동 소수점 텍스처 좌표를 완벽한 정확도로 정수 텍셀에 매핑하는 것은 까다롭고 계산하는 데 시간이 많이 걸리며 일반적으로 필요하지 않은 작업입니다. 대부분의 하드웨어 구현에서는 삼각형 내 각 픽셀 위치의 텍스처 좌표를 계산하기 위해 반복 접근 방식을 사용합니다. 반복 접근 방식은 반복 중에도 오류가 균일하게 누적되므로 이러한 오류를 숨기는 경향이 있습니다.

Direct3D 기준 래스터라이저는 각 픽셀 위치의 텍스처 인덱스를 계산하기 위해 직접 평가 방식을 사용합니다. 직접 평가는 작업 중에 발생하는 모든 오류는 더 많은 임의 오류 분포를 나타낸다는 점이 반복 접근 방식과 다릅니다. 이로 인한 결과는 기준 래스터라이저가 완벽한 정확도로 이 작업을 수행하지 않기 때문에 경계에서 발생하는 샘플링 오류가 더 많이 눈에 띌 수 있다는 것입니다.

최선의 접근 방식은 필요한 경우에만 근접점 필터링을 사용하는 것입니다. 사용해야 하는 경우에는 경계 위치에서 약간 텍스처 좌표를 오프셋하여 불필요한 부분을 방지하는 것이 좋습니다.

텍스처 필터링