프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다.
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 https://gamedevforever.com 대마왕J 2011.12.17 22:57 신고  댓글주소  수정/삭제  댓글쓰기

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

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

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

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

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

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

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

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

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

    고맙습니다~