-
S3, DXT, BC게임 개발 2021. 1. 6. 02:17
이게 사실 같은 놈인데 회사 및 저작권 관련인데... 변종이라 보면 되겠다.
요즘은 MS문서에서도 BC라고 하는나와있는거 보면 이젠 BC로 말하는게 맞는것 같다.
아무래도 BC는 Block Compress로 브랜드를 탈피한 용어니까...
예전 256 color 의 아이디어를 4x4 텍셀 단위로 바꾼것이다.
게다가 4x4라는게 큰것 같지만 크지 않은 텍셀이다.
그래서 대강 철저히 4x4로 뭉개는 느낌이라고 보면 될것이다.
1. BC1
크기 설명 color_0 2 Byte 16텍셀 중 최소 칼라 (vector로 봤을때 절대값이 최소) color_1 2 Byte 16텍셀 중 최대 칼라 (vector로 봤을때 절대값이 최대) d/c/b/a (텍셀) 1 Byte 한 텍셀당 2 bit h/g/f/e (텍셀) 1 Byte l/k/j/i (텍셀) 1 Byte p/o/n/m (텍셀) 1 Byte * 16텍셀을 8byte에서 표현 (1텍셀당 4bit)
bit 값 설명 color_0 00 16텍셀 중 최소 칼라 color_1 01 16텍셀 중 최대 칼라 color_2 10 2/3*color_0 + 1/3*color_1 color_3 11 1/3*color_0 + 2/3*color_1 2. BC2
BC2는 알파채널을 따로 뺐다. 그게 무려 8 Byte나 된다.
(color bit는 2bit인 반면 alpha bit는 4bit)
따라서 전체 1텍셀당 8 bit다.
이 다음부터는 전부 16텍셀당 16 Byte이다.
그럼에도 256칼라와 동급이다. 요즘은 비디오 메모리 모잘라도 팔레트 안쓰는 이유를 알것 같다.
alpha bit를 별도로 뺐으니까 칼같이 딱 끊어지는 이미지에 유리하겠다.
글씨라던지...
3. BC3
이번 버전의 변형된점은 alpha도 min/max로 나누고 3 bit씩 할당했다는것이다.
한 텍셀에서 알파값이 급격히 변하지 않는다면 (부드럽게 블렌딩되는 머리카락, 이펙트등...)
alpha_0과 alpha_1을 거꾸로 배치해서 외곽선 부분을 효과적으로 구현하려 했다.
사실 정확한 의도는 모르겠다. alpha_0, alpha_1, alpha_6, alpha_7에 같은 숫자가 들어갈 수 있다.bit 값 alpha_0 > alpha_1 (6단계) alpha_0 <= alpha_1 (4단계) alpha_0 000 최대 최소 alpha_1 001 최소 최대 alpha_2 010 6/7*alpha_0 + 1/7*alpha_1 4/5*alpha_0 + 1/5*alpha_1 alpha_3 011 5/7*alpha_0 + 2/7*alpha_1 3/5*alpha_0 + 2/5*alpha_1 alpha_4 100 4/7*alpha_0 + 3/7*alpha_1 2/5*alpha_0 + 3/5*alpha_1 alpha_5 101 3/7*alpha_0 + 4/7*alpha_1 1/5*alpha_0 + 4/5*alpha_1 alpha_6 110 2/7*alpha_0 + 5/7*alpha_1 0 alpha_7 111 1/7*alpha_0 + 6/7*alpha_1 255 4. BC4, BC5
BC4는 1채널(R), BC5는 2채널(RG)이다. BC4두개 붙인게 BC5다. 그래서 BC4는 생략한다!
겨우 두 채널로 뭐에 쓸까 하겠지만.. 사실 중요하다.
바로 N.O.R.M.A.L M.A.P 에 사용한다.
그런데?? 우리가 아는 normal map은 xyz 3채널이다.
그런데 두개를 쓰는게 말이 되는가?
말이 된다. 어차피 길이가 1로 정규화 되어있는 vector 값이다. (unsigned normal 1, signed normal은 2)
두개를 알면 하나는 계산해서 알 수 있다!
일단 두가지 모드가 있다. 하나는 signed normal (-1 ~ 1), 하나는 unsigned normal (0 ~ 1) 이다.
bit 값 rg_0 > rg_1 (6단계) alpha_0 <= alpha_1 (4단계) rg_0 000 최대 최소 rg_1 001 최소 최대 rg_2 010 (6*rg_0 + 1*rg_1)/7.0f (4*rg_0 + 1*rg_1)/5.0f rg_3 011 (5*rg_0 + 2*rg_1)/7.0f (3*rg_0 + 2*rg_1)/5.0f rg_4 100 (4*rg_0 + 3*rg_1)/7.0f (2*rg_0 + 3*rg_1)/5.0f rg_5 101 (3*rg_0 + 4*rg_1)/7.0f (1*rg_0 + 4*rg_1)/5.0f rg_6 110 (2*rg_0 + 5*rg_1)/7.0f 0.0f rg_7 111 (1*rg_0 + 6*rg_1)/7.0f 1.0f 5. BC6H, BC7
BC6H는 HDR 지원이다.
BC7은 모드가 많다. 더욱 다양해졌다. 16 Byte 를 가지고 16텍셀을 얼마나 다양하게 다룰지... ㅋㅋㅋ
이건 다룬다면 따로 써야겠다. (스크롤 압박!!!)
'게임 개발' 카테고리의 다른 글
URP 약어 (0) 2021.06.05 MetaHuman to ALS v4 for UE4 #2 (0) 2021.06.01 MetaHuman to ALS v4 for UE4 #1 (0) 2021.05.26 previousViewProjectionMatrix 를 가져오고 싶을때 (0) 2020.10.08 Compute Shader에서 Dispatch와 numthreads의 관계 (0) 2020.09.23