프로그래밍 2020. 4. 5. 18:00
728x90

 

왜 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

 

채널이 커질때, 값의 오차범위가 줄어드는것은 확실하다, 흐음~~

 

728x90

'프로그래밍' 카테고리의 다른 글

그림자 버퍼 필터링  (0) 2020.04.17
쉐이더 그림자 vsm light bleeding  (0) 2020.04.13
멀티렌더타겟 MRT  (0) 2020.04.02
문제입니다, 이 코드는 컴파일 될까요?  (0) 2020.03.24
직선, 반직선, 선분 정의  (0) 2020.01.14
posted by BK dddDang
: