저는NCKStudio 에서 야구 게임의 3D엔진을 개발하고 있습니다.
벌써 2년이 넘었네요.
오늘은 Skeletal Model의 Instancing 에 대해 이야기해볼까 합니다.
ShaderModel 2.0 에서의 Instancing 이야기이므로, 3.0 쓰면 되시는 분은 안읽으셔도 좋습니다. ^^
SkeletalModel의 Instancing 은 의외로 많은 곳에 쓰일 수 있습니다. 콘솔게임에서 적들이 우루루 몰려오는 모습이라던지, 저희 게임에서처럼 스포츠게임에서 관중표현등에 꽤 유용하게 쓰일 수 있습니다. 관중에 무슨 Skeletal 이냐~ 라는 말씀을 하실 수 있겠지만, 보다 더 자연스러운 애니메이션을 위해서 어쩔 수 없는 선택이었습니다. 그리고 적용 결과 적당히 퍼포먼스가 잘 나와주는 탓에 비교적 성공적이었던 작업이라 생각이 드네요.
저희 게임에서는 관중옵션을 최대로 하면 모든 관중(약10000명)이 뼈대를 갖는 폴리곤 모델로 렌더링되게 됩니다. 각 관중당 약 300개의 폴리곤을 가지고 있는데 그냥 렌더링하면 300만 폴리곤이 렌더링 되게 되죠.
그럼 그냥 Instancing을 잘 쓰면 되지 않느냐~ 라고 생각하실테지만 저희 게임은 ShaderModel 2.0까지만 쓸 수 있습니다. 그렇다 보니 Instancing 을 쓸때 몇 가지 제약사항이 생겨버렸습니다.
어쨌든 여러가지 시도를 해보았습니다. 기본적인 Instancing이야 Direct-X SDK 를 보시면 아실듯 하여 Instancing 에 대한 설명은 하지 않겠습니다.
일단 제가 Instancing을 할 때 필요했던 정보는 다음과 같았습니다.
1. 각 메쉬의 포지션
2. 각 메쉬의 회전값
3. 각 메쉬의 좌우 미러링(왼손잡이가 오른손잡이로;;) 정보
4. Texture Atlas 정보
5. 그외...에도 몇가지가 있긴한데 기억이 잘;;-_-
3번 좌우 미러링은 한 번에 여러명의 관중을 렌더링할 때 애니메이션이 똑같으면 너무 눈에 띄므로 좌우 미러링이 가능해야 했습니다.
4번 Texture Atlas는 한 번에 여러명의 관중을 렌더링하기 때문에 텍스쳐의 활용도를 높여야 했습니다. 그렇다고 해서 이 Atlas 정보의 값이 크면 오히려 비효율적일 수 있으므로, 2,3,4,5번의 값을 16바이트로 최대한 압축하여 쉐이더로 넘겼습니다.
그리고 가장 문제가 되는 부분은 바로 Deformable Mesh 의 Vertices 업데이트였습니다.
두 말 할 필요도 없이 ShaderModel 2.0 을 사용한다면 다음의 방법밖에는 없습니다.
1. CPU 에서 한 마리의 Vertex를 갱신하고 버퍼에 쭉 복사한다.
2. 걍 죄다 GPU 에서 스키닝한다.
결론은 2번의 승이었습니다.
물론 Vertex Shader를 정말 열심히 최적화 해야했습니다. ㅠㅠ 최적화 없이는 1번이 더 빨랐던 기억입니다.
DrawPrimitive는 10000명의 관중이 출력되면 200번이 되도록 만들었습니다. 한 번의 렌더링당 50명의 관중이 렌더링되는 셈인데 이 50명의 관중은 Texture Atlas에 따라 다양해지고, 좌우 미러링 때문에 더 다양해집니다. 게다가 띄엄띄엄 배치해버리면... 실제로 이게 Instancing을 사용하여 출력된건지 아닌건지 모를정도가 되어버립니다.
사실 게임에서 관중옵션을 최대로 올리면 60fps 가 나오던 게임이 15fps 로 떨어져버립니다. 역시나 실제로 쓰기엔 무리다... 라는 것이지요. 이 속도는 게임이 네트웍상태에서 플래이되는 모든 처리를 포함한 속도입니다. 물론 Instancing을 하면서 라이팅 처리까지 포함한 속도입니다.
그러나 10000명이 아닌 5000명을 렌더링하면 속도는 그럭저럭 게임할 수준은 나와줍니다.
폴리곤이 700개정도인 메쉬를 렌더링한다면 2500명 정도는 그럭저럭 버텨준다는 이야기이지요. 더불어 여기에 LOD 까지 들어간다면? 크게 걱정없이 게임을 할 수 있는 수준이 되어버립니다.
Shader Model 3.0 에서의 최적화 방법은 따로 생각해본적은 없습니다만 그냥 생각해도 Shader Model 2.0 보다는 더 -_- 빠를것 같네요.
뭐 Shader Model 2.0 쓰시면서 Instancing 을 쓰시는 분은 별로 많지 않을거라 생각합니다만, 고심하시는 분께 도움이 되었으면 좋겠네요.
더 좋은 아이디어가 있으시거나 잘못된 부분이 있다면 댓글을 남겨주세요~ ^^
갑자기 밤에 할일이 없어서 쓰게 되었는데; 쓰면서 졸음이 몰려온 탓에 마지막을 후다닥 마무리-_- 하게 되었네요; 궁금하신점은 댓글을..
Search
'ShaderModel2'에 해당되는 글 1건
- 2008/04/17 Skeletal Model의 Instancing (3)

