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
일반적으로 버텍스 구조체를 잡으면,
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
덧글
" 무조건 압축을 해라, 그리고 결과물이 문제가 있다면 리소스를 다시 만들어라."
한마디로 닥치고 리소스 압축은 하라는 이야기..ㅋ
불안하시면, 그냥 D3DCOLOR형으로 저장하셔도 됩니다.