저는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
'Game Dev./Renderings'에 해당되는 글 8건
- 2008/04/17 Skeletal Model의 Instancing (3)
- 2006/08/09 Depth Of Field
- 2006/03/15 Particle Effect
- 2006/01/27 Parallax Mapping
- 2006/01/25 Billboard Beam (4)
- 2005/05/15 Water reflection, refraction
- 2005/04/25 Blood Trail
- 2005/02/28 비 구현
Depth Of Field(걍 심도라하자)는 우리가 피사계 심도라고 부르는것과 같은데, 우리 눈이 어떤 사물에 초점을 맞추면 그 앞에 있는 물체나 뒤에 있는 물체가 흐릿하거나 두개등으로 번져보이는 현상을 말한다.
이러한 현상은 우리가 늘 겪는 현상이고, 심도 표현력이 좋은 카메라(렌즈포함-_-) 에서도 볼 수 있다.
이러한 효과는 초점을 맞춘 부분(물체)을 부각시켜준다.(알아듣기 쉬운말로 말해 화면이 뭔가 좀 더 있어보이게 해준다)
구현 방법은 여러가지가 있고, 실제로 렌즈의 원리를 이용하여 구현하는 방법이 퀄리티가 좋아보인다. 하지만 역시나 매우 느리다.
앞으로 나오는 차세대 게임이라면, 보다 더 사실적인 연출과 효과를 보여주기 위해 필수적으로 가지고 가야할 기술이라고 생각된다.
실제로 간단히 구현하는것은 그리 어렵지는 않으나, 속도 및 몇가지 상황에 따른 문제점등이 아직 남아있다. 여튼 머리 좋은 사람들이 열심히 고민해준덕분에 많은 문제점들을 피해갈 수는 있다.
역시나 이 기술에 대한 몇가지 문서를 링크한다.
이 문서만으로 간단히 게임에 적용할 수 있다.(기존의 쉐이더 코드 수정이 꽤 귀찮을 수 있다)
http://www.ati.com/developer/gdc/Scheuermann_DepthOfField.pdf
http://www.ati.com/developer/shaderx/ShaderX2_Real-TimeDepthOfFieldSimulation.pdf
이러한 현상은 우리가 늘 겪는 현상이고, 심도 표현력이 좋은 카메라(렌즈포함-_-) 에서도 볼 수 있다.
이러한 효과는 초점을 맞춘 부분(물체)을 부각시켜준다.(알아듣기 쉬운말로 말해 화면이 뭔가 좀 더 있어보이게 해준다)
구현 방법은 여러가지가 있고, 실제로 렌즈의 원리를 이용하여 구현하는 방법이 퀄리티가 좋아보인다. 하지만 역시나 매우 느리다.
앞으로 나오는 차세대 게임이라면, 보다 더 사실적인 연출과 효과를 보여주기 위해 필수적으로 가지고 가야할 기술이라고 생각된다.
실제로 간단히 구현하는것은 그리 어렵지는 않으나, 속도 및 몇가지 상황에 따른 문제점등이 아직 남아있다. 여튼 머리 좋은 사람들이 열심히 고민해준덕분에 많은 문제점들을 피해갈 수는 있다.
역시나 이 기술에 대한 몇가지 문서를 링크한다.
이 문서만으로 간단히 게임에 적용할 수 있다.(기존의 쉐이더 코드 수정이 꽤 귀찮을 수 있다)
http://www.ati.com/developer/gdc/Scheuermann_DepthOfField.pdf
http://www.ati.com/developer/shaderx/ShaderX2_Real-TimeDepthOfFieldSimulation.pdf
TAG 3d
파티클 이펙트
파티클 이펙트 자료는 도대체 찾기가 힘들어서-_-
맨땅에 헤딩하는식으로 시작을 했다.
일단 결론은...
1.정말 별거없다.(사실 사용 목적이 매우 간단한것들을 표현하기 위해서이기 때문에)
2.조금 재미있다.(화면에 나오니까 재미있다-_-)
3.금방 한다.(기능만3일-_-도안걸린거같다)
그럼 어떻게 시작해야 하느냐?
1. 네모난 판때기를 만든다.(입자 생성기 만들고, 잘 관리한다)
2. 구조를 잘 만들어서 파티클 입자 하나하나에 대해 정보를 넣고, 메쉬 정보를 넣자(판때기가 아니라 구,실린더,큐브가 될수도 있다)
3. 일단 가속도를 넣어서 좀 움직여 본다.
4. 판때기에 텍스쳐를 입힌다.(빌보딩도)
5. 텍스쳐 애니메이션도 해본다.
6. 필요한 각종 파라미터를 넣고 연산하기 시작한다.-_-
6번부터 규모가 커진다-_-
중요한 점은.
쓸때없이 new/delete 하는일이 없도록 하고, 메모리 새지 않도록 잘 관리하며, 속도 느리지 않게 알아서 잘 최적화를 하는것이다.
MMORPG 같은데서 쓸 이펙트 시스템이라면....
개발 단계에서 생각해야할 부분이 너무 많을 수도 있겠다. -_- 어려운것보단 귀찮은게 많겠다.
역시나 제일 힘들고 귀찮은건...
UI
아 가장 중요한걸 빼먹었는데...
일단 눈에 결과가 보이기 시작하면 진도가 매우 빨라진다.
그래픽팀에 이펙트 담당자와 잘 쌰바쌰바해서 기능을 넣으면 강력한 이펙트 시스템이 될 것이다.
파티클 이펙트 자료는 도대체 찾기가 힘들어서-_-
맨땅에 헤딩하는식으로 시작을 했다.
일단 결론은...
1.정말 별거없다.(사실 사용 목적이 매우 간단한것들을 표현하기 위해서이기 때문에)
2.조금 재미있다.(화면에 나오니까 재미있다-_-)
3.금방 한다.(기능만3일-_-도안걸린거같다)
그럼 어떻게 시작해야 하느냐?
1. 네모난 판때기를 만든다.(입자 생성기 만들고, 잘 관리한다)
2. 구조를 잘 만들어서 파티클 입자 하나하나에 대해 정보를 넣고, 메쉬 정보를 넣자(판때기가 아니라 구,실린더,큐브가 될수도 있다)
3. 일단 가속도를 넣어서 좀 움직여 본다.
4. 판때기에 텍스쳐를 입힌다.(빌보딩도)
5. 텍스쳐 애니메이션도 해본다.
6. 필요한 각종 파라미터를 넣고 연산하기 시작한다.-_-
6번부터 규모가 커진다-_-
중요한 점은.
쓸때없이 new/delete 하는일이 없도록 하고, 메모리 새지 않도록 잘 관리하며, 속도 느리지 않게 알아서 잘 최적화를 하는것이다.
MMORPG 같은데서 쓸 이펙트 시스템이라면....
개발 단계에서 생각해야할 부분이 너무 많을 수도 있겠다. -_- 어려운것보단 귀찮은게 많겠다.
역시나 제일 힘들고 귀찮은건...
UI
아 가장 중요한걸 빼먹었는데...
일단 눈에 결과가 보이기 시작하면 진도가 매우 빨라진다.
그래픽팀에 이펙트 담당자와 잘 쌰바쌰바해서 기능을 넣으면 강력한 이펙트 시스템이 될 것이다.
TAG 3d
보통 레이저나 각종 광선효과를 표현하기 위해 단순히 빌보딩 하는 방식을 많이 쓴다.
나도 아무 생각 없이 -_- 빌보딩시켜서 구현을 하였는데;
gems3 에 billboard beam 에 대한 내용이 나와있다.
이걸 응용해서 연결 고리식의 billboard beam을 만들면 효과가 괜찮을 것 같다.
articulated billboard beam -_- 이라 해야하나;
어쨌든 구현했는데 이쁘지 않다면-_- 함 살펴보는것도.~
나도 아무 생각 없이 -_- 빌보딩시켜서 구현을 하였는데;
gems3 에 billboard beam 에 대한 내용이 나와있다.
이걸 응용해서 연결 고리식의 billboard beam을 만들면 효과가 괜찮을 것 같다.
articulated billboard beam -_- 이라 해야하나;
어쨌든 구현했는데 이쁘지 않다면-_- 함 살펴보는것도.~
TAG 3d
물은 개발자밖에 신경 안쓴다고.. ㅋㅋㅋ
암튼 물이 들어가니까 분위기가 좀 사는듯 하다-_-
반사맵 reflect vector에서 -_- 오타때문에 좀 고생했지만..ㅠ.ㅠ
오늘 오후를 이거때매 다 보낸듯..ㅠ.ㅠ
오브젝트를 살짝 가려주는 센스~
암튼 물이 들어가니까 분위기가 좀 사는듯 하다-_-
반사맵 reflect vector에서 -_- 오타때문에 좀 고생했지만..ㅠ.ㅠ
오늘 오후를 이거때매 다 보낸듯..ㅠ.ㅠ
오브젝트를 살짝 가려주는 센스~
대충 끄적거려본 비..
비에 대한 자료는 하나도 없는거 같다-_-
활용도가 얼마나 될진 모르겠지만, 10~20분 끄적 거려서 만든거 치고는-_-
잘 나왔다라고 스스로 만족을-_-
먹구름이 태양을 가리고, 먹구름이 밀려오며 비가 와야 하는데-_-
비에 대한 자료는 하나도 없는거 같다-_-
활용도가 얼마나 될진 모르겠지만, 10~20분 끄적 거려서 만든거 치고는-_-
잘 나왔다라고 스스로 만족을-_-
먹구름이 태양을 가리고, 먹구름이 밀려오며 비가 와야 하는데-_-








