ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • S3, DXT, BC
    게임 개발 2021. 1. 6. 02:17

    이게 사실 같은 놈인데 회사 및 저작권 관련인데... 변종이라 보면 되겠다.

    요즘은 MS문서에서도 BC라고 하는나와있는거 보면 이젠 BC로 말하는게 맞는것 같다.

    아무래도 BC는 Block Compress로 브랜드를 탈피한 용어니까...

     

    예전 256 color 의 아이디어를 4x4 텍셀 단위로 바꾼것이다.

    게다가 4x4라는게 큰것 같지만 크지 않은 텍셀이다.

    그래서 대강 철저히 4x4로 뭉개는 느낌이라고 보면 될것이다.

     

     

    1. BC1

    BC1 구성, 총 8 Byte (16텍셀당)

     

      크기 설명
    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 구성, 총 16 Byte (16텍셀당)

    BC2는 알파채널을 따로 뺐다. 그게 무려 8 Byte나 된다. 

    (color bit는 2bit인 반면 alpha bit는 4bit)

    따라서 전체 1텍셀당 8 bit다. 

    이 다음부터는 전부 16텍셀당 16 Byte이다. 

    그럼에도 256칼라와 동급이다. 요즘은 비디오 메모리 모잘라도 팔레트 안쓰는 이유를 알것 같다.

     

    alpha bit를 별도로 뺐으니까 칼같이 딱 끊어지는 이미지에 유리하겠다.

    글씨라던지...

     

     

    3. BC3

    BC3 구성, 총 16 Byte (16텍셀당)

    이번 버전의 변형된점은 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는 생략한다!

     

    BC5 구성, 그림은 3byte 맞추려해서 그렇고 4x4는 변함없다.

    겨우 두 채널로 뭐에 쓸까 하겠지만.. 사실 중요하다.

    바로 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텍셀을 얼마나 다양하게 다룰지... ㅋㅋㅋ

    이건 다룬다면 따로 써야겠다. (스크롤 압박!!!)

     

     

     

     

     

    댓글

Designed by Tistory.