HDR 이라고 그래픽스에서는 거의 뭐 요즘에는 기능 실장 안하면 이상할 정도로 많이 적용되는 후처리 기법이 있음.
이게... 뭐냐면, 우선 자체를 설명하기 전에 원론부터 나가면 모니터는 대개 8비트, 8비트, 8비트 3채널을 가지고 색상을 출력하는 경우가 많음.
즉, 한 채널마다 색 분류를 256 가지로 처리해서 표현하는 게 가능함.
(요즘에는 10비트 모니터라 해서 각 색 채널을 1024분류로 표현해주는 모니터도 있지만 졸라 비싸고 흔히 쓰는 건 아니니 여기선 제외함)
그래픽스의 일반적인 처리에서는 8비트 0 ~ 255 를 가지고 색처리를 하는게 아니라, float 형태로 임의의 값을 가지고 색 처리를 해서 리턴값으로 넘겨주면
이를 그래픽스 드라이버 단에서 0 ~ 255 등으로 변환 시켜주던가 해서 모니터에 출력하게 한다고 알고 있음.
그런데 float3 (vec3) 과 같은 RGB 값을 리턴으로 넘겨줄 때, 따로 특별한 전처리 설정이 안 되어 있으면 0 ~ 1 바깥의 값은 다 짤려서 처리가 됨.
문제는 컴퓨터 자체에서 정한 각 색상 채널의 표현 한계 수는 8비트일지언정, 실제 세상의 색들은 8비트들로는 도저히 처리가 안되는 색들도 많다는 것임.
예를 들어서 태양의 빛에 의해 양지가 드는 곳의 미세 표현이나, 아니면 석양의 경우 석양 자체에서 빚어내는 색들,
아니면 음지에 있을 때 눈의 보정에 의해서 미세하게 보여지는 디테일함 등등...
그래픽스에서 색을 그냥 처리를 해서, 1 을 넘는 색상의 표현을 클램핑해서 내보내기에는 디테일도 떨어지고 원래 표현하고자 하는 바를 제대로 표현하기 힘듦.
여기서 HDR (High Dynamic Range) 라고 카메라? 에서 있던 기법을 좀 변형해서 그래픽스에 쓰기 시작함.
그래픽스에서의 HDR 란, 캡쳐된 이미지의 색상들의 휘도를 가지고 해당 이미지의 평균 휘도를 구해서 전체를 톤맵핑 하는 거라고 보면 됨. (야매라서 틀릴지도 모름)
톤맵핑이란, 말 그대로 톤을 맵핑한다는 거임. 휘도를 높이거나 낮추거나 하는거 ㅇㅇ
이렇게 0 ~ 1 값으로 다 담을 수 없는 색상들을 0 ~ 1 으로 그럴싸하게 맵핑하면서도 디테일을 다 챙기고자 하는 것이 그래픽스의 HDR 이라는 기법임.
근데 화면이 빽빽하게 어떤 색상으로 채워지는 실시간 그래픽스의 경우에는 그냥 HDR 알고리즘을 적용하면 알아서 되는데,
레이트레이서에서는 지글거리는 것 때문에 샘플링이 낮으면 제대로 톤맵핑이 안먹혀 들어가는 것 같음 ㅠ
그래서 지글거리는 부분을 제외하게끔 약간 변형을 해서 HDR 을 구현해봄. 그게 위에 있는 짤.
점차 밝아지는 건 HDR 을 적용할 때 0 ~ 1 의 회색 중앙값을 사용해서 HDR 을 구현하는데, 이 값을 높여서 찍은거임.
밑 짤은 조명을 구현한 걸로 커넬 박스 만든 것.
원래는 조명을 먼저 구현할려고 했는데 HDR 이 없으면 제대로 구현이 안될 것 같아서 HDR 먼저 하고 조명을 구현했음.
ㅇㅇ 이번 글은 끝
그럼 hdr 어두운거에서 밝은거의 범위는 0~255 보다 더 넓은 범위인데 예를들어 0~768 그걸 0~255범위로 줄인다는거지? 넘어간걸 짜르는게 아니라 곱해서? 비율이 같아지도록? - dc App
네
자글자글하네
샘플링 몇개 안해서 그럼요
이분 글 보면서 새로 배우는게 많아서 좋음 - dc App
감사합니당