반응형

http://cagetu.egloos.com/4920663



Vertex Component Packing라는 쓰레드에서 보셨듯이, Nebula3를 보고 버텍스 압축을 해보았습니다.

일반적으로 버텍스 구조체를 잡으면,
    struct {
        float3 position;
        float3 normal;
        float2 uv;
        float4 skinWeights;
        float4 skinIndices;
    };
로 처리를 하는데,
    struct {
        float3 position;
        ubyte4n normal;
        short2 uv;
        ubyte4n skinWeights;
        ubyte4 skinIndices;
    };
로 압축하여 처리하는 것입니다. (다른 방법도 있지만, 네뷸라를 기준으로 합니다.)
하나의 버텍스 크기가 64Byte -> 28Byte로 줄어듭니다. 폴리곤 갯수가 많아질 수록 엄청난 차이가 생기겠지요.
대신, shader 내부에서 압축을 풀어주는 한번의 간단한 계산이 추가됩니다.

이것이 가능한 이유는 normal은 -1~1사이, uv는 0~1사이, skinWeights도 0~1 사이, skinIndices는 0~255사이의 값을 가지므로, 거의 눈에 띄지 않을 정도의 적당히 정밀도를 줄여주면, 압축이 가능합니다.

예전에 matrix pallate를 처음 접할 때, ubyte4형으로 처리하는 것을 해보셨던 분은 아시겠지만, 이것은 뭐, 새로운 기능은 아닙니다. 다만, 자원 상황이 꽤 좋은 편인 pc나 콘솔에서는 크게 사용할 이유가 없었는데, (handheld 3d작업 시에는 fixed point를 많이 사용했더군요.) 그 만큼 복잡도가 커졌다는 것이겠지요.

float -> short는 fixed point로 압축을 하면 되고요.
ubyte4 압축은 예전에 matrix pallate 작업을 해보신 분이시라면, 간단히 하실 수 있을 것이므로, 따로 이야기를 드릴 필요가 없겠군요. 주의할 것은 ubyte4와 ubyte4N의 차이를 잘 파악해야 합니다.
"UBYTE4는 bone index들을 저장하는데 좋다. 왜냐하면, 0~255 범위까지 확장이 가능하다. UBYTE4N은 같은 포멧이지만, 0~1까지만 확장이 가능하다. 그래서, 이것은 color, blendweights와 normals들에 사용하면 좋다"

[reference]
1. ShaderX - Tip and Trick - : Part2-1. 셰이더 안에서 정점 압축 풀기
2. 게임&인터랙티브 애플리케이션을 위한 수학 - fixed point
3. Modern Fixed-point Tricks and Optimizations-DevMaster.net
 
싸이월드 공감트위터페이스북

트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://cagetu.egloos.com/tb/4920663 [도움말]
  • 멀티코어와 스트리밍 - 압축과 메모리 관리 2009/05/05 19:44 #

    개인적으로 게임에서 스트리밍(streaming)의 중요성과 대단함을 처음 알았던 때는 던전시즈를 끝냈을 때였다. 게임을 다시 시작하지 않는 한 로딩 없이 엔딩까지 진행할 수 있었던 게임, 그 당시의 하드웨어 환경을 사용하면 참 놀라운 일이다.이제 멀티 코어 환경의 엔진에서 스트리밍은 지원하는 것이 당연한 기본적인 특징이 되었다. 사실 다른 처리에 비하면 스트리밍은 쉬운편에 속한다. 다른 쓰레드의 잡(job)을 방해하는 일 없이 워크 쓰레드(wo...... more

  • normalmap-dxt 압축 2009/05/07 01:34 #

    Vertex Component Packing 처리에 이어서, normalmap도 압축을...NVIDIA에서 제공하는 Real-Time Normal Map DXT Compression를 많이들 읽어보셨겠지만, 아직 못 본 사람(저요.. ㅡㅡ;;)들을 위해서, 소개합니다.최근 보고 있는 Nebula3에서는 DXT5nm으로 사용하는 것이 기본으로 되어 있는데, photoshop dds plug-in 등을 이용해서, .tga등의 노말맵을 DXT5nm ...... more

덧글

  •  teze 2009/04/21 02:00 # 답글

    게임 사이드 리소스 압축에 관한 명언이 하나 있지요..
    " 무조건 압축을 해라, 그리고 결과물이 문제가 있다면 리소스를 다시 만들어라."
    한마디로 닥치고 리소스 압축은 하라는 이야기..ㅋ
  •  cagetu 2009/04/21 15:21 #

    다시 만들어달라고 하면, 만들어 줄까?? ㅎㅎ
  •  kimsama 2009/04/28 16:53 # 답글

    최근 작업 결과물 중에서 상당히 맘에 드는 결과물입니다. 스트리밍이랑 이거랑 연동해서 밀도 있는 장면 연출을 빨리 보고 싶다능... ㅋ
  •  대훈 2009/12/30 16:53 # 삭제 답글

    압축작업을 하면서 ubyte4n에 관해 검색을 해보았는데 많은 글이 콜오브듀티에서 이 기능을 사용하는데 지원하지 않는 카드라 게임을 못한다는 글이 많네요. 혹시 어떤 카드부터 지원하는지 아시는지 해서 글 남깁니다.
  •  cagetu 2009/12/31 09:31 #

    7xxx 버전 이상이면, 되는 것으로 알고 있습니다. 그러니까, 보드에 통합된 인텔 그래픽 카드가 아니면, 대략 적용된다고 볼 수 있겠죠?!
    불안하시면, 그냥 D3DCOLOR형으로 저장하셔도 됩니다.

반응형

'그래픽스(Graphics) > DirectX9~12' 카테고리의 다른 글

BackBuffer 와 스왑체인저  (0) 2012.11.02
쿼드뷰 swapchain class 정리  (0) 2012.11.02
MFC & Directx 에서 스왑체인 멀티뷰구현  (0) 2012.11.01
MFC와 Directx 연동  (0) 2012.11.01
블렌더 무료  (0) 2012.10.31

+ Recent posts