프로그래밍 2019. 11. 30. 18:12
728x90

 

hdr 구현에서 가장 애매했던 부분은,

 

그럼 과연, 현재 내 게임 (sdr)에 hdr이 제대로 적용되면,

색상이 어떤식으로 바뀔것인가? 였다

어떤 화면이 나올지를 정확하게 예측하기가 애매해서,

(사실, hdr 이 제대로 적용되기전까지는 모르는 일이지 않은가)

화면을 출력할때마다 긴가민가, 제대로 출력이 된 것인지,

뭔가 문제가 있는것인지를 잘 모르겠다는 것이었다

 

sdr vs hdr 의 비교화면을 웹에서 검색해보면,

대략 bloom 이 적용된 사례가 많고, 밝은 곳인 경우가 대부분이다

(이건 이럴수밖에 없는게,

현재로서는, 아주 강한 빛에 hdr 의 진가가 나타나기 때문에,

이 말은 즉, 그 외의 색표현에서는 sdr 과 큰 차이가 없다라는 말이 된다)

 

나공간의 경우는 밤배경이고,

기본 어두운 공간이기 때문에, 내 스스로의 목표는

좀더 어두운곳이 어둠단계가 많아지고,

색상범위가 넓어져, 디테일해져 풍부한 화면을 보고싶었다

 

근데, 이게 막상 상상을 해보면, 어떤 색감일지가 딱떠올리기가 힘들다는 이야기다

 

그래서, 일단, 이것저것 삽질을 하면서의 결론으로는,

 

sdr 일때의 이미지샷을 미리 남겨두고,

hdr 관련 쉐이더 작업을 하면서 출력을 해볼때, 

sdr 화면샷과 비교해보는 것이 도움이 된다는 것이다

 

나의 경우도

처음에는 그냥 막 하다가, 

어느정도 구현 정리가 되면서부터는, 샷을 계속 남겨서

출력을 비교해보고는 했다

(화면, PrtSc 키를 눌리고, 그림판에 복사해두면, 샷 남기기가 쉬워진다)

 

이렇게 비교를 해보면,

sdr 과 hdr 과의 차이가 눈으로 느껴지기 시작한다

 

다시, 이야기하자면,

hdr 이라고, 뭔가 확 색상이 바뀐다거나, 무척 선명해져서, 

바로 알아볼수있다거나,

하는 것은 아니란 것이다

 

그 차이가 생각보다는 미세하다, 

아니, 오히려, sdr 화면이 나아보일때도 있다

 

자, 그럼

1장 내용에 이어서

증폭된 값범위를 어떻게 사용할 것인가?

 

여기서 톤매핑이 등장한다

(특정한 이미지를 만드는 과정이 아니다,

PS 내부에서 공식을 적용해서 rgb 값을 조절해주는 것이다)

 

톤매핑은

값범위가 어떻던지간에, 통과시키면 무조건 ( 0~1 ) 범위로 값을 조절해주는

공식들이다

 

톤매핑 공식중 가장 유명한 공식을 살펴보자

const float3 ToneMap_Reinhard( float3 hdr )
{
    return hdr / (hdr + 1);
}

 

0 -> 0,

0.1 -> 0.1 / 1.1

0.5 -> 0.5 / 1.5

1 -> 1 / 2 (0.5)

2 -> 2 / 3

...

1000 -> 1000 / 1001

 

절대로 1이 되지 못하고,

값들이 좀더 작은 값으로 변화된다

 

ToneMap_Reinhard 는 1 -> 0.5 가 된다,

1보다 큰 색상값이 많을때, 밝은 부분을 디테일하게 사용하기에 좋은 공식이고,

나는 평균적으로 좀더 균등한 영역에 걸쳐, 사용할수 있는 공식을 톤맵으로 사용하였다

 

//전체적으로 균등한 톤맵
float3 ToneMapACES( float3 hdr )
{
    const float A = 2.51, B = 0.03, C = 2.43, D = 0.59, E = 0.14;
    return saturate( (hdr * (A * hdr + B)) / (hdr * (C * hdr + D) + E) );
}

 

PS에서 전체 화면의 마지막 출력전에

last.rgb = ToneMapACES( last.rgb );

하나를 추가하므로써, 

이제, 우리는 hdr 을 사용할수있게 되었다

 

원본이미지를 만드는데 사용되는 조명값을 뻥튀기해보고,

(디퓨즈 강도라든가, 스펙큘러 강도라든가, 뭐 여러가지를 해볼수 있겠다)

전체적인 밝기도  바꾸어보고,

sdr 상태에서의 출력과 비교를 해보자

 

검은영역의 값은 좀더 쪼개지고, 흰영역의 값도 좀더 쪼개져서

전체적으로 화면의 색상이 뭉치지 않는 것을 확인해볼수 있을 것이다

 

일단,

hdr 구현이 되었다!

 

 

sdr 상태화면

 

hdr 톤맵적용

 

그래, 된거야,

 

뭐, 화면의 색감이 우리가 상상하던

뭔가 더 선명하고, 더 디테일해지고, 더 풍부해진것같아 보이지는 않지만,

뭔가 좀 전체적으로 허여므레진것 같기도하고,

뭔가 만족스럽지는 않지만,

되긴 된거야

 

별로, 만족스러운 화면은 아닐것이다,

각자의 셋팅값에 따라 결과가 다를수 있겠지만,

나의 경우는 이거 뭐야이거, 하나마나잖아, 속은기분이 들었달까...

 

다음장으로~

728x90
posted by BK dddDang
: