먼저 쉐이더를 만들 필요는 없습니다. 우선은 고정기능파이프라인 (쉐이더의 반대) 과 FVF 를 쓰는 것만으로도 웬만한 처리는 다 할 수 있고 속도가 느린 것도 아니므로 쉐이더를 안 쓰는 버전을 우선 만들어 놓고 추후에 쉐이더 지원을 하는 것도 나쁘지 않을 것입니다. 물론 처음부터 쉐이더를 하는 것도 좋지만 전체적인 엔진을 만들어보지 않은 초심자에게는 부담이 될 것입니다.
대략적인 순서를 나눈다면, d3d 의 각종 인터페이스를 wrap 할 자체적인 클래스들과, 렌더링 할 페이스나 메쉬를 메터리얼단위로 모아놓았다 찍어주는 기능, 텍스춰 관리자등의 저수준 라이브러리가 하나 있어야 할 것이고, 그 저수준 라이브러리의 상위레이어로 사용할, 모델 파일과 텍스춰 파일을 읽어서 갖고 있고 애니메이션, 씬 그래프, 스키닝등의 처리를 할 상위 수준 라이브러리를 만드는 순서로 하면 될 것 같군요.
세부적인 질문사항은 다시 물어보시길..
2003.04.29 19:59:08 (*.186.117.176)
HwiD
텍스춰 관리자라는 것은 어떤 역할을 하는 것이지요? 죄송하지만 제게는 생소한 단어라서요... 설명해 주시면 고맙겠습니다...
2003.04.29 20:29:37 (*.98.55.80)
neolith
보통 게임에서는 여러개의 텍스춰를 로드해서 쓰게 됩니다.
예를 들어서 apple.bmp 라는 파일과 banana.bmp 라는 파일이 있다고 합시다. 프로그램이 실행되다보면 파일명을 갖고 텍스춰를 (정확히 말하자면 ID3DTexture 의 포인터를) 알아내고
싶을 경우가 자주 생깁니다. 이럴 때 텍스춰 매니저라는 것을 두어, 새로운 텍스춰를 로드할때마다 이름과 포인터를 등록하게 하고, 텍스춰 매니저에 이름을 주면 포인터를 받아올 수
있게 하는 것입니다.
또한 텍스춰를 쓰기 전에 미리 읽어서 d3d 오브젝트로 만들어야 하는데, 때때로 프로그램에서 어떤 텍스춰를 사용할지 모를때가 많습니다. 이럴때에는 텍스춰 매니저에 이름을 주면
텍스춰 매니저가 내부정보를 검색해서 텍스춰가 있으면 곧바로 포인터를 주고, 텍스춰가 없으면 텍스춰를 로드해서 포인터를 만드는 것까지 자동화하는 것이 편리합니다. OnDemand
방식이라고 생각하시면 됩니다.
2003.04.30 09:32:50 (*.186.117.176)
HwiD
아아~ 저는 학규님께 처음 듣네요... 정말 큰 가르침 되었습니다. 감사드립니다.
네오리스의 방은 즐거움의 방이로군요~ ㅅㅅ 또 가르침 받으러 들르겠습니다~~~
2003.04.30 12:10:31 (*.98.55.80)
neolith
한가지 더 추가하자면.. 위와 같은 방식으로 텍스춰 매니저를 사용하게 되면, 텍스춰가 계속 읽히기만 하지 없어지는 일은 없습니다. 윈도우가 가상메모리를 지원하고, d3d 가 managed 타입을 지원하기 때문에 텍스춰가 많아진다고 해서 안된다거나 하지는 않지만, 정도 이상으로 많아지게 되면 효율이 많이 낮아집니다.
그러므로 어느정도 이상 공간을 차지하게 되면 그 이상 공간을 차지하지 않도록 텍스춰들을 비워줘야 합니다. 어떤 텍스춰를 비울 것인가를 판단하는데에는 몇가지 선택방법이 있겠지만, 가장 상식적으로 생각할 수 있는 방법은 LRU (Least Recently Used) 방식입니다. 즉 가장 쓴지 오래된 자원을 우선적으로 버린다는 의미입니다. 이 방법을 구현하려면 각각의 자원(텍스춰)마다 사용 요청이 들어올때 '최종사용시각'을 기재해놓고 있다가, 나중에 텍스춰 공간을 비워줘야 할 경우에는 최종사용시각이 오래된 순으로 필요한 공간이 확보될때까지 비워주는 방법입니다.
이 방법을 사용하면 텍스춰에 사용될 공간이 일정 이상 넘어가지 않게 유지되므로, 공간할당 세팅을 잘 해주면 (사용자 컴퓨터의 메인 메모리 양에 따라 달라지겠지만) 가상메모리에 의존하지 않아도 됩니다. 참고로 가상메모리는 사용자가 직접 메모리 관리를 해주는 것보다 느릴 수 밖에 없습니다. 사용자가 직접 메모리 관리를 하면 디스크의 '읽기'기능만 사용하게 되지만, 가상메모리는 '쓰기'와 '읽기'기능을 둘 다 사용하게 됩니다. 보통 디스크는 쓰기가 읽기보다 훨씬 시간이 걸리는 작업이라는 것을 감안할 필요가 있지요.
LRU 방식을 이용해서 자원관리를 하면 대부분의 상황에서는 가장 합리적으로 자원을 사용할 수 있지만, 예외가 있을 때도 있습니다. 예를 들어서 메인 메모리 상에 텍스춰 10 개를 올릴 공간밖에 없는데, 화면상에는 20 개의 텍스춰를 한번에 사용해야 한다고 가정해봅시다. 만약 곧이 곧대로 LRU 방식을 사용하게 되면 텍스춰 1 개를 찍을때마다 계속 모든 텍스춰를 지워버려야 하게 됩니다. 이러한 상황이 발생시에는 정 반대로 MRU 방식을 사용해야 합니다. (John Carmack 이 퀘이크의 텍스춰 관리자에서 소개한 방식입니다) 즉, 텍스춰를 사용한 다음에 다음 텍스춰를 쓰게 될 때에는 가장 최근에 썼던 텍스춰를 비워버리는 것입니다. 이렇게 해서 오히려 남아있는 다른 텍스춰가 다시 활용될 기회를 벌 수 있습니다. 자세한 사항은 직접 종이에 그려가면서 생각해보시기 바랍니다.
이러한 텍스춰 관리는 요즘에는 D3D 의 자원 관리기능과 가상메모리지원때문에 중요성이 덜해지긴 했지만, 알아두면 다른 부분에도 쓰임새가 많고, 부가적인 성능향상을 노릴 수 있는 기능입니다. 또한 텍스춰에 국한되지 않고 다른 파일 자원에 대해서도 똑같이 적용되는 사항입니다.
대략적인 순서를 나눈다면, d3d 의 각종 인터페이스를 wrap 할 자체적인 클래스들과, 렌더링 할 페이스나 메쉬를 메터리얼단위로 모아놓았다 찍어주는 기능, 텍스춰 관리자등의 저수준 라이브러리가 하나 있어야 할 것이고, 그 저수준 라이브러리의 상위레이어로 사용할, 모델 파일과 텍스춰 파일을 읽어서 갖고 있고 애니메이션, 씬 그래프, 스키닝등의 처리를 할 상위 수준 라이브러리를 만드는 순서로 하면 될 것 같군요.
세부적인 질문사항은 다시 물어보시길..