DirectX Graphics 프로그래밍 가이드 고정 기능 파이프라인 텍스처 텍스처 필터링 최근점샘플링   [목차열람] [주소복사] [슬롯비우기]
최근점샘플링
 
Microsoft DirectX 9.0

최근점샘플링


애플리케이션은 반드시 텍스처 필터링을 사용할 필요는 없다. 텍셀 주소를 계산 (이 주소는 정수가 아닌 것이 많다)하거나 이 값에 가장 가까운 정수 주소를 가지는 텍셀의 색을 복사 하도록(듯이) Microsoft® Direct3D® 를 설정할 수 있다. 이 처리를최근점샘플링이라고 부른다. 텍스처의 사이즈가 스크린 위에의 기본도형의 화면의 사이즈와 거의 같은 경우에는, 이 방법에 따라 텍스처는 고속으로 효율적으로 처리할 수 있다. 양쪽 모두의 사이즈의 차이가 큰 경우는, 텍스처를 확대하거나 축소할 필요가 있다. 이러한 처리를 실행한 결과, 화면이 엉성해지거나 톱니 모양이 생기거나 불선명하게 되는 일이 있다.

C++ 애플리케이션에서는,IDirect3DDevice9::SetSamplerState 메서드를 호출해 최근점샘플링을 선택할 수 있다. 제 1 인수의 값을, 텍스처 필터링 방법을 선택하는 텍스처의 정수 인덱스 번호 (0 ~ 7)로 설정한다. 제 2 인수로서 D3DSAMP_MAGFILTER,D3DSAMP_MINFILTER, 또는 D3DSAMP_MIPFILTER 를 건네주어, 확대, 축소, 또는 밉맵 필터를 설정한다. 제 3 인수로 D3DTEXF_POINT 를 건네준다.

최근점샘플링은 주의해 사용하는 것. 2 개의 텍셀간의 경계에서 텍스처가 샘플링 될 때, 경우에 따라서는 부자연스러운 그래픽스 효과가 생기는 일이 있다. 이 경계란, 샘플링 대상의 텍셀이 다음의 텍셀로 옮길 때의, 텍스처에 따른 위치 좌표 (u 또는 v)이다. 포인트 샘플링을 사용할 때, 시스템에서는 샘플 텍셀을 1 개 선택하는지, 다른 텍셀을 선택한다. 이것에 의해, 경계가 교차하고 있을 때는 결과가 텍셀간에 갑자기 변화하는 일이 있다. 이 영향으로부터, 표시되는 텍스처안에, 바람직하지 않은 부자연스러운 그래픽스 이펙트가 나타나는 일이 있다. 선형 필터링을 사용했을 경우, 결과 텍셀은 인접 텍셀간에 계산되어 텍스처 인덱스가 경계를 따라 옮기는데 따라서 매끄럽게 블렌드 된다.

이러한 이펙트는, 매우 작은 텍스처를 매우 큰 다각형에 맵핑 하면 (이러한 처리를확대라고 부른다) 발생한다. 예를 들어, checker반과 같은 텍스처로 포인트 샘플링을 사용하면 checker반은 확대되어 엣지가 두드러진다. 대조적으로, 선형 텍스처 필터링을 사용했을 경우는, checker반의 색이 다각형 전체에 걸쳐서 매끄럽게 변화한 화면이 완성된다.

대부분의 경우, 최선의 결과를 얻기 위해서(때문에)는, 최근점샘플링의 사용을 가능한 한 피하도록(듯이) 한다. 최근의 하드웨어의 대부분은, 선형 필터링용으로 최적화되고 있기 (위해)때문에, 퍼포먼스가 저하할 것은 없다. 다만, 텍스처를 사용해 읽기 쉬운 텍스트 문자를 표시하는 경우 등, 목적의 이펙트를 내기 위해서(때문에) 아무래도 최근점샘플링을 사용하지 않으면 안 되는 경우는, 텍셀 경계에서 샘플링을 실시하지 않게 유의하고 생각하지 않는 이펙트가 생기지 않게 세심의 주위를 기울일 필요가 있다. 다음 그림은 부자연스러운 그래픽스 효과가 어떠한 것인지를 나타내고 있다.

6 개의 부분으로부터 완성되는 박스의 우상에 있는 2 개의 사각형안에 불연속의 붉은 수평선이 들어가 있는

그룹내의 우상에 있는 2 개의 사각형이 인접하는 사각형과는 다른 것에 주의한다. 이것들에는 대각 오프셋(offset)가 있다. 이러한 부자연스러운 그래픽스 효과를 막으려면 , Direct3D 에 있어서의 최근점샘플링의 텍스처 샘플링 규칙을 잘 이해할 필요가 있다. Direct3D 에서는,[0.0, 1.0] (0.0 ~ 1.0 으로, 0.0 으로 1.0 을 포함한다)의 범위의 부동 소수점 텍스처 좌표를 [–0. 5, n – 0.5] (n 는 텍스처 위에의 특정의 넓이에 있는 텍셀의 수)의 범위의 정수 텍셀 공간값에 맵핑 한다. 결과의 텍스처 인덱스는, 가장 가까운 정수에 말 수 있다. 이 맵핑에 의해, 텍스처 경계에서는 샘플링의 오차가 생기는 경우가 있다.

간단한 예로서 D3DTADDRESS_WRAP 텍스처어드레싱모드로 다각형을 렌더링 하는 경우를 생각해 본다. Direct3D 의 맵핑을 사용하면u 텍스처 인덱스는, 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 레퍼런스 래스터라이저에서는, 각 픽셀 위치에서의 텍스처 인덱스의 계산에 직접 평가법을 이용한다. 직접 평가는 반복 처리와는 달라, 처리 위에의 오차가 보다 랜덤인 에러 분포를 나타낸다. 이 결과, 경계상에서는 보다 현저한 샘플링 에러가 발생한다. 이것은, 레퍼런스 래스터라이저가 이 처리를 정확하게는 실행하지 않기 때문이다.

최근점필터링은, 필요한 경우에만 사용 해야 한다. 이것을 사용할 필요가 있는 경우는, 텍스처 좌표를 경계 위치 좌표로부터 약간 오프셋(offset) 해 부자연스러운 효과의 발생을 막는 것을 추천한다.



© 2002 Microsoft Corporation. All rights reserved.
↑TOP