jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다. 3ds Max를 사용해서 게임용 3D 캐릭터를 셋업하는 방법
이를 위해 오랜 실무를 경험해 온 저자의 고급 노하우들이 공개
위 내용은 GameDevForever의 저자분들의 홍보를 위하여 운영진 자체적으로 올린 광고이며 일체의 수익이 없습니다.(밥좀사줘요~)
Posted by 김포프
얼마 전에 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이 가장 크기가 큰 밉맵(즉, 첫번째 밉맵)이다."입니다.

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

포프였습니다.

댓글을 달아 주세요

  1. Favicon of http://gamedevforever.com 대마왕J 2011.12.17 22:57 신고  댓글주소  수정/삭제  댓글쓰기

    오오 이건 근데 언제 쓰게 될까요? 대충 생각되기론, 블러 효과를 간략하게 내야 할 일이 있을때 스크린 버퍼를 밉맵으로 만들어서 출력한다던가, 혹은 화면의 평균 명도를 구해야 할 때 최종으로 1픽셀까지 압축으로 만들 때 쯤 사용할 수 있을 듯 한데요.
    그리고 3번째 0은 무엇에 쓰나요?

    • Favicon of http://gamedevforever.com cagetu 2011.12.17 23:14 신고  댓글주소  수정/삭제

      몇가지 활용할 수 있는 방법이 있을테지맠, 강제로 lod레벨을 조정하녀 최척화를 할 수도 있겠구요. Texture atlas 로 묶은 텓ㄱ,텨의 lod를 위해서도 사용되곶 합니다. ㅎ. 세번째가 0인 것은 자도 모르겠메뇨ㅜㅜ

    • Favicon of http://gamedevforever.com ozlael 2011.12.18 00:49 신고  댓글주소  수정/삭제

      의외로 밉맵과 상관 없는 이유로 활용 될 수도 있어요 ㅎㅎ
      if문을 사용할 시 [branch]란 태그를 사용 할 수가 있어요. 간단히 말씀드리자면 분기문을 빠르게 수행 할 수 있는 건데요,
      이를 제대로 활용하려면 tex2d대신 tex2dlod를 사용하는게 좋아요. 밉맵이 필요 없는 후처리에서는 많이 활용 할 수 있어요

    • Favicon of http://gamedevforever.com 김포프 2011.12.19 04:31 신고  댓글주소  수정/삭제

      제가 이거 쓴 계기는... 저희 스페이스 마린 Character Customizer만들었을 때, 실시간 DXT 텍스처 압축을 했거든요... 게이머가 고른 색상 및 데칼을 가져와서 포토샵 블렌딩 공식넣어서 최종 텍스처를 렌더타겟에 그린 뒤 그걸 실시간으로 DXT압축...(미친게지 -_-)

      이러면 첫번째 밉만 나오니까.. 이거만 쓰면 속도도 느리고 멀리서 볼 때 경계가 쪼글(?)거리고... 그래서 밉맵도 만들어야 했는데.. 텍스처에서 첫번째 밉맵만 읽어와서 두번째 밉맵만들고.. 그 다음엔 두번째 밉맵만 읽어와서 세번째 밉맵만들고 이런식이니까 제로 밉맵 하나만을 불러와야 했어요.. 그때 썼음. (역시 제정신은 아니었다고 생각... -_- )

  2. sgpro 2012.01.02 14:06 신고  댓글주소  수정/삭제  댓글쓰기

    고맙습니다~



티스토리 툴바