최상단 광고

2012년 4월 9일 월요일

밉맵에 관하여


밉맵은 하나의 텍스쳐를 일정한 크기로 축소시켜서 여러장을 가지고 그려질때 현재 사이즈에
가장 적합한 이미지를 찾아서 쓰는 것을 말한다.
이것의 이점을 본다면, 일단 기본적으로 폴리곤에 텍스쳐를 입힐때 폴리곤에 맞는 텍셀을 찾아야 
한다.  따라서 폴리곤이 화면에 보일때 텍스쳐 실제 사이즈와 동일하다면, 내부적으로 매우 쉽게
찾을 것이다. 하지만 그렇지 못할때, 적당한 값을 찾아서 그리는데 시간을 소모할 것이다.
( 보통 필터링을 사용해서 색보간을 해서 그린다. 작게 할때는 색을 합치고 키울때는 보간하고...)문제는 실제 화면에 한픽셀을 차지하는 폴리곤이 있다고 했을때 그 한픽셀을 그리기 위해서
512 X 512 크기의 텍스쳐를 모두 필터링해서 하나의 픽셀을 가져온다고 생각해보자.
생각만으로도 느릴것같다는 생각이 들지 않는가? ( 아니라고 말하는 당신. 그냥 그렇다고 생각해주시구려... ) 그래서 나온것이 바로 밉맵이다.

실제로 밉맵은 구형 그래픽카드일수록 그 효과가 잘 나타나지만(속도라던지..), 최신카드일 수
록 잘 나타나지 않는다.
일단 자동으로 밉맵을 만들기위해서는 2의 지수형 정방형 텍스쳐이어야만한다.
밉맵을 쓰지않고 하나만 만들면 사이즈를 자유롭게 할수있지만, 그게 아니면 2의 지수형태를
띠어야만한다.
( OGL에서는 무조건적으로 2의지수형이어야만 만들어졌었다. 최신OGL은 바뀌었다는 이야기가
들리지만.. )
그렇다. 다 아는 내용을 이야기 했다. 사실 내가 하고싶은 말은 여기서 부터다. (라고해봐야...ㅡ.ㅡ)
기본적으로 다이렉트X에서 텍스쳐를 생성할때 밉맵체인 (그러니까 하나의 이미지를 축소시키는
단계를 말한다.)의 수를 정할 수 있다. 기본적으로 옵션에 그부분에 0을 넣는다.
0은 디폴트값을 의미하며, 자동으로 알아서 끝까지 만들어 준다는 의미다. 그래서 언제나 텍스쳐를
 로드할때 그냥 밉맵레벨에 0을 넣어서 자동으로 밉맵을 만들어서 사용하는 것이다.
문제는 생성한 텍스쳐를 가지고 장난을 칠때 종종 실수를 한다는 것.
일단 텍스쳐에 렌더링을 한다고 하자. 그때는 렌더텍스쳐를 생성하는데 이때도 그냥 아무 생각없이
 밉맵을 자동으로 생성해버리기 일수이다.
뭐 그렇게 해서 생성이 안된다면 다행이지만(다행일까?), 분명한 것은 아무 문제없이 생성이 된다.
그다음에 우리는 0번표면에 렌더링을 걸고, 이후 그것을 폴리곤 어딘가에 발라서 사용할때, 문제가 발생한다. 아무것도 안그려졌거나, 괴상하게 깨져나가는 텍스쳐를 발견하게 될것이다.
물론 운이 좋아서, 아무 문제없이 잘 그려지기도 한다.
 처음에 잘그려짐을 경험하고, 나중에 안됨을 경험하면 왜 안되는건지 파악하는데 제법시간이
걸린다. ( 그게바로 나다. ㅡ.ㅡ )

 밉맵체인은 텍스쳐를 로딩할때 자동으로 한번 만들어 주는것 뿐이지, 이후 표면을 수정했다고
자동으로 나머지들도 만들어주는 것은 아니라는 사실을 몰랐던 시절이다.
 이것은 오직 렌더텍스쳐만 말하는것이 아니다. 텍스쳐에 lock을 걸고 편집작업을 하는것도 역시
마찬가지다. 보통 0번만 편집하고 사용하는데, 역시 위와 같은 문제가 발생해서 왜 안되는건지
대책없이 멍하니 있거나 엄한 D3D와 Ms를 욕하는 일을 벌일 수 있다는 것이다.

그럼 이글을 읽은 초심자라던가, 아직 D3D라는 것을 해봤지만, 텍스쳐가지고 장난 안 친 사람들
이라면, 밉맵체인을 자동으로 만들고, 0번만 편집하고 똑바로 안된다고 시간허비하지 말기를...

댓글 없음: