쉐이더 색상값 0 ~ 1 why?
왜 0 ~ 1 로 표현될까?
갑자기 급궁금증이 생겼다
공식처럼, 누구나 그렇게 사용하니까, 어디에서든 그렇게 사용하니까
나도 그냥 그렇게 사용하고 그게 당연하다고 생각했는데,
갑자기 궁금증이 밀려왔다
우리의 렌더타겟은 보통 8888 로 사용을 하고,
색상당 각각 8비트 채널을 사용하는데,
우리가 잘 알다시피, 8비트는 0 ~ 255, 즉 256 개의 숫자로 표시할수 있다
그런데, 쉐이더에서 색상값은 보통 0 ~ 1로 표시한다
설마 0 ~ 255 까지 표시할수 있는게 아닐까??
밑에 글에서 색의 표현정보 부분을 읽어보자
(감사합니두아~!)
https://kblog.popekim.com/2011/12/02-part-2.html
[포프의 쉐이더 입문강좌] 02. 진짜 쉬운 빨강쉐이더 Part 2
게임 프로그래머 김포프의 블로그
kblog.popekim.com
위의 블로그를 참고해보면, 비트(8,16,32비트...)마다 최고값이 달라지기때문에,
비트에 상관없이 공통적으로 사용할수있는 백분율로 수를 표시하고,
1/100 = 0.01, 45/100 = 0.45, ...
즉, 0~1까지의 숫자로 표현한다고 한다
그런데 좀더 궁금한것이,
float 는 원래 32bit type 이고, 대충 (-억 ~ 억) 까지의 숫자를 표현할수있다
그러면, 8bit type 으로 float 를 사용한다면, 실수 0~1 까지를 모두 표현할수있는 것일까?
0.01, 0.4789, 0.90112
간단히 생각해봐도 256 값의 범위를 훨씬~ 넘어서기 때문에,
float 에서 8bit 만을 사용한다는 것은 아닌것같고,
좀 상상을 해보자
렌더타겟이 있다
ps 에서 색상값 0.0415 를 return 했다면,
directx에서, 렌더타겟의 최대표현수를 곱한다,
렌더타겟이 8비트라면,
0.0415 * 256 = 10.624
소수점을 제외하고 반올림한다면,
11을 렌더타겟에 저장한다
라는 개념으로 이해가 갈듯도한데,
그럼,
이 렌더타겟에서 다시 값을 읽어올때는,
directx 에서 렌더타겟의 최대표현수로 나누어
11 / 256 = 0.04296
값을 돌려준다?
값차이가 생각보다 큰데?
이게 맞을까??
아시는분, 설명좀 부탁드립니두아~~
추가적으로 계산해 보았다
16비트 채널일때는,
0.0415 * 32768 = 1359.872
반올림해서 1360,
1360 / 32768 = 0.041503
채널이 커질때, 값의 오차범위가 줄어드는것은 확실하다, 흐음~~