2011년 4월 28일 목요일

[누락된 설명서] tex2Dlod()

얼마 전에 GPU상에서 텍스처의 밉맵을 만드느라 tex2Dlod() 함수를 사용할 일이 있었다. HLSL 함수인 tex2Dlod()는 텍스처좌표를 float4 변수를 받는데 이 float4의 네번째 성분이 텍스처 샘플링에 사용할 밉 레벨을 가리킨다고 한다.

여기서 날 다소 혼란스럽게 한 부분... "2번째 밉맵을 샘플링하려면 다음 둘 중에 정확히 어떤 값을 전달해줘야 하는거지?"

  1. texcoord = float4(u, v, 0, 1);

    또는
  2. texccord = float4(u, v, 0, 1 / 총 밉맵 수)

불행히도 이걸 제대로 설명해 놓은 문서를 찾지 못했다. MSDN에도 설명되어 있지 않고, 구글 검색에서도 실패....

괜히 쓸데없이 검색하느라 시간 낭비하는 사이 직장동료 바레로 박사님이 렌더 몽키를 사용해서 재빨리 테스트를 해봤더니 첫번째가 정답이란다. 즉, 두번째 밉맵을 읽어오려면 float4의 4번째 성분에 1을 대입해줘야 한다. 다시 한 번 생각해보니 D3D 샘플러 상태인 D3DSAMP_MAXMIPLEVEL을 살펴보면 제대로 유추할 수도 있었다. MSDN은 D3DSAMP_MAXMIPLEVEL을 다음과 같이 설명하고 있다:
D3DSAMP_MAXMIPLEVEL: level-of-detail index of largest map to use. Values range from 0 to (n - 1) where 0 is the largest. The default value is zero.
두번째 문장을 대충 번역하면 "0 부터 n-1 까지의 값을 사용할 것. 0이 가장 크기가 큰 밉맵(즉, 첫번째 밉맵)이다."

참고로 이렇게 정수로 밉맵 레벨을 가리키는 것은 OpenGL과 DirectX에서 동일하다.