Normalize 가 가능하기 위해선 저장형태는 소숫점이 필요하다.
그렇기 때문에 쉐이더에선 float 형태로 저장이 된다. (float4 같이)
하지만 실제로 저장될 땐 크기에 따라 CHAR, UCHAR 이나 INT16, UINT16 같이 정수형이다.
예로 쉐이더 안에서의 float4(1,1,1,1) 값이 R8G8B8A8_UNORM 포맷으로 저장된다 해보자.
그럼 cpu 같은 데에서 읽을 때 byte 별로 255, 255, 255, 255 이렇게 저장되어 있을 것이다.
왜냐하면 8비트에서 부호가 없으면 최대로 표현할 수 있는게 2^8-1 = 255 이기 때문이다.
만약 위같은 포맷에서 float(123) 이 들어갔으면 그냥 값은 1로 처리된다.
그렇기 때문에 위같은 경우엔 직접 Normalize 를 시켜야 한다.
이때 표현가능한 비트 수가 n 이면 2^n - 1 을 나누면 가장 간단한 Normalize 가 가능하다.
이때 헷갈려서 2^n 으로 나누지 않도록 주의하자.
숫자의 값이 작을 땐 괜찮은데 어느 이상 커질 수록 오차가 발생하기 때문이다.
예를들어 n = 8 의 경우 256으로 정규화 시 실제로는 (255 / 256) * 255 = 254 가 저장된다.
댓글 없음:
댓글 쓰기