개발 노트 DirectX11 - Skinned Instancing 2013/02/02 18:18 by cagetu

DirectX11 - Instancing에 이이서 이왕하는 김에 스킨드 인스턴싱까지 끝을 보기로 했다.

스킨드 인스턴싱의 기본 패턴은 텍스쳐에 Skinned Mesh의 BoneTM 정보들을 쌓아 놓은 다음에 각 인스턴스에 대해서 텍스쳐에서 BoneTM 리스트를 얻어오는 것이다.

DirectX11에서는 Texture를 이용할 수도 있고, Buffer 를 이용할 수도 있는데 사용하는 방식은 거의 동일하다. 일단 Texture를 이용해서 구현했는데, Buffer 사용법도 익힐 겸해서 Buffer 이용해서도 처리해 놓을 생각이다.

좀 애를 먹은 부분은 Shader Model 4.0 이상부터는 HLSL이 많이 달라져서, 사용법이 생소해서 그걸 익히는데 시간이 좀 걸렸다.
Shader Model 4.0부터는 텍스쳐를 익는 방식이 Texture Object를 기준으로 Load, Sample로 나눠졌는데, Load는 그냥 인덱스로 텍셀의 위치를 지정하면 되고, Sample은 [0, 1] 사이의 uv를 넘겨야 하는 듯 하다.

또, SV_InstanceID가 각 인스턴스의 index를 받아오는데, 이게 넘어오면, 굳이 InstanceBuffer를 별도로 만들 필요가 없을 것 같은데.... 이 부분도 테스트를 좀 해봐야 할 듯 하다. 

Instancing에 대한 사례는 "DirectX 11 Rendering in Battlefield3" GDC 발표자료를 보면 알 수 있는데, Buffer와 SV_InstanceID를 이용해서 Instancing을 구현한 듯 하다.

DirectX11도 조금씩 하다 보니까 익숙해지기는 하는구나. DirectX9랑 거의 구현 방식 자체는 비슷한데, 전체적으로 api가 너무 많이 달라서, 리서치하면서 진행하는데 시간이 꽤 걸리는 듯 하다. (api에 대한 설명이 자세히 나온 부분이 별로 없어서 고생.. 고생...)

이젠 모델은 출력되니, 테셀레이션, 멀티 쓰레드 렌더링 같은 내용도 한번 공부해보도록 해야겠다.

추가)
1. SV_InstanceID
: DirectX9에서 InstanceID를 알기 위해서, VertexBuffer를 사용했는데, SV_InstanceID라는 System Value가 버텍스 데이터를 얻어올 때, Input Assembler Stage에서 받아오기 때문에, Instance 번호를 알 수 있게 되니 좋은 듯...

2. Texture Object -> Buffer Object
: Texture에 Bone 데이터를 기록해서 사용하는 것을 Buffer Resource를 이용해서 바꿔보았음. 일단 Shader Resource Buffer에 대해서 자료가 많이 없어서, 이리 저리 찾아서 하느라 많이 헤멨음... 
또, Shader에서 내부적으로 Buffer Object가 텍스쳐 레지스터에 바인딩되기 때문에 텍스쳐랑 비슷하게 사용되는 듯 한데, 아직 Texture 와 Buffer를 사용할 때 어떤 것이 더 이점이 있는지에 대해서는 정확히 파악하기가 어려움...
(사실 아직도 정확히 Flags에 대해서 이해를 못했음. 이런 저런 작업을 해보면서 익히는 수 밖에... 냠~) 

Direct 9 to Direct 10 Considerations을 좀 더 읽어봐야겠다...


덧글

댓글 입력 영역



메모장

내가 먼 훗날에 이 글들을 보았을 때, 좋은 추억이 될 수 있기를...

나를 위해... 나에게 쓰는...

msn: cagetu@hotmail.com
mail: cagetu79@gmail.com
twitter: twitter.com/cagetu
facebook: facebook.com/cagetu