얼마 전에 GPU상에서 텍스처의 밉맵을 만드느라 tex2Dlod() 함수를 사용할 일이 있었습니다. HLSL 함수인 tex2Dlod()는 텍스처좌표를 float4 변수로 받는데 이 float4의 네번째 성분이 텍스처 샘플링에 사용할 밉 레벨을 가리킨다고 하더군요.
여기서 절 다소 혼란스럽게 한 부분이 "2번째 밉맵을 샘플링하려면 다음 둘 중에 정확히 어떤 값을 전달해줘야 하는거지?" 였습니다.
texcoord = float4(u, v, 0, 1);
또는
texccord = float4(u, v, 0, 1 / 총 밉맵 수);
불행히도 이걸 제대로 설명해 놓은 문서를 찾지 못했고, MSDN에도 설명되어 있지 않고, 구글 검색에서도 실패....
괜히 쓸데없이 검색하느라 시간 낭비하는 사이 직장동료인 다니엘(저와 같이 KGC 발표 했던 그 박사님이십니다)이 렌더 몽키를 사용해서 재빨리 테스트를 해봤더니 첫번째가 정답이라더군요. 즉, 두번째 밉맵을 읽어오려면 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이 가장 크기가 큰 밉맵(즉, 첫번째 밉맵)이다."입니다.
'프로그래밍' 카테고리의 다른 글
Fast RTTI ( Run-Time Type Infomation ) (35) | 2012.01.03 |
---|---|
툴과 오버 엔지니어링 그리고 벽돌 (19) | 2012.01.02 |
[누락된 설명서] tex2Dlod() (5) | 2012.01.01 |
Reprojection Cache (23) | 2011.12.27 |
캐릭터 에니메이션 관련 논문 분석 1 (15) | 2011.12.25 |
싸우자 파인만, 수도꼭지 물줄기 (24) | 2011.12.23 |
댓글을 달아 주세요
오오 이건 근데 언제 쓰게 될까요? 대충 생각되기론, 블러 효과를 간략하게 내야 할 일이 있을때 스크린 버퍼를 밉맵으로 만들어서 출력한다던가, 혹은 화면의 평균 명도를 구해야 할 때 최종으로 1픽셀까지 압축으로 만들 때 쯤 사용할 수 있을 듯 한데요.
그리고 3번째 0은 무엇에 쓰나요?
몇가지 활용할 수 있는 방법이 있을테지맠, 강제로 lod레벨을 조정하녀 최척화를 할 수도 있겠구요. Texture atlas 로 묶은 텓ㄱ,텨의 lod를 위해서도 사용되곶 합니다. ㅎ. 세번째가 0인 것은 자도 모르겠메뇨ㅜㅜ
의외로 밉맵과 상관 없는 이유로 활용 될 수도 있어요 ㅎㅎ
if문을 사용할 시 [branch]란 태그를 사용 할 수가 있어요. 간단히 말씀드리자면 분기문을 빠르게 수행 할 수 있는 건데요,
이를 제대로 활용하려면 tex2d대신 tex2dlod를 사용하는게 좋아요. 밉맵이 필요 없는 후처리에서는 많이 활용 할 수 있어요
제가 이거 쓴 계기는... 저희 스페이스 마린 Character Customizer만들었을 때, 실시간 DXT 텍스처 압축을 했거든요... 게이머가 고른 색상 및 데칼을 가져와서 포토샵 블렌딩 공식넣어서 최종 텍스처를 렌더타겟에 그린 뒤 그걸 실시간으로 DXT압축...(미친게지 -_-)
이러면 첫번째 밉만 나오니까.. 이거만 쓰면 속도도 느리고 멀리서 볼 때 경계가 쪼글(?)거리고... 그래서 밉맵도 만들어야 했는데.. 텍스처에서 첫번째 밉맵만 읽어와서 두번째 밉맵만들고.. 그 다음엔 두번째 밉맵만 읽어와서 세번째 밉맵만들고 이런식이니까 제로 밉맵 하나만을 불러와야 했어요.. 그때 썼음. (역시 제정신은 아니었다고 생각... -_- )
고맙습니다~