Kasa Study(www.dev3d.net) 이창희(cagetu@softnette.com) 2010.10.31 High Dynamic Range Kasa Study(www.dev3d.net) 이창희(cagetu@softnette.com) 2010.10.31
HDR? High Dynamic Range의 약자 이미 현시대 게임에서는 보편화된 기능 특별히 설명할 말 없음… ㅌㅌㅌ (앞으로 나오는 것들도 설명은 간략히 넘어가겠음)
HDR? 왜 HDR을 발표할까? 널리 사용되고 있지만, 결과가 좋게 나오게 하기란 생각보다 쉬운 작업이 아님. 생각보다 많은 작업자들은 DirectX Sample에 의존적인 듯 구현에 대한 설명이 너무 부족함 GDC, SIGGRAPH, CEDEC에서는 아직도 HDR이 언급된 발표가 이어지고 있음. Uncharted2, tri-Ace 사의 발표 등… 우리가 게임에서 구현하는 그래픽은 Realistic이 아니라, Photo-Realistic 한 것!!!!! 결국 HDR은 그 시작!!! 결국 좋은 결과물을 얻기 위해서는 HDR 과정에 대한 전반적은 이해가 필요함
HDR 작업 목록
HDR Data HDR을 처리하기 위해서는 HDR 데이터가 필요. 즉, 0~1 사이 이상으로 정보가 기록되어 있어야 함. 간단하게 Floating Texture를 사용 A16FR16FG16GB16F HDR Data 압축하기 LogLUV, RGBE
HDR Data 압축 LogLUV Playstation3에서는 Floating Texture를 사용할 수 없기 때문에, HDR을 표현하기 위한 압축 기술이 연구되었고, 그 중 가장 보편적으로 사용되는 방법이 LogLUV 압축임 Heavenly Sword에서 사용하기 시작 http://www.anyhere.com/gward/papers/jgtpap1.pdf 그냥 Color를 압축해서, 복원하는 식이라면, 그렇게 눈에 띄는 결함이 없음. 하지만, Luminance를 구하는 과정에서 손실이 많아서, 상대적으로 디테일이 많이 떨어짐.
Gamma Correction HDR 처리의 linear space에 color 정보가 되어 있다고 가정한다.
Gamma Correction (Cont’) Post-Processing을 작업할 때에는 처음 텍셀을 sRGB->linear 변환을 해주고, 마지막 Step의 마지막 Pass에서 linear->sRGB 변환을 해줘야 한다.
Linear-Space Lighting: Conclusion “Drake! You must believe in linear-space lighting!” [Uncharted 2 : HDR Lighting]에서 발췌 9 9 9 9 9 9
Tone Mapping Luminance 구하기 Tone Mapping Operator HDR 영역을 LDR 영역으로 표현하기 위한 방법 평균 Luminance를 중심으로 0~1 사이의 값으로 매핑. 즉, 우리가 해야 할 것은 평균 Luminance를 구하고, Luminance 구하기 Luminance를 중심으로 0~1 사이로 Tone Mapping Operator
Luminance 구하기 Luminance는 빛의 밝기를 의미 위의 공식을 이용하여, 평균 Luminance를 구함. 최종 결과는 1x1 Luminance 장면의 평균 밝기는 각 픽셀의 밝기를 구하는 것부터 출발 각 픽셀의 밝기 구하기?
RGB -> Luminance RGB를 Luminance를 변환 Luminance 상수를 이용하여, Luminance 계산 LUMINANCE = float3(0.2125f, 0.7154f, 0.0721f); dot(rgb, LUMINANCE); Luminance를 다시 RGB로 전환 불가 CIE Yxy Encoding을 이용하여, 압축 RGB -> CIE XYZ -> CIE Yxy (Y값이 Luminance) 이후 Tone mapping을 통한 luminance의 값의 변화를 가지고 다시 RGB로 변환이 가능
Luminance Adapation 광적응 효과 시간에 따라, 갱신할 장면의 luminance로 변경 갑자기 어두운 곳에서 밝은 곳으로 나왔다거나, 밝은 곳에서 어두운 곳으로 들어갔을 때의 서서히 눈이 적응하는 효과 시간에 따라, 갱신할 장면의 luminance로 변경 Luminance History Function 급작스러운 변화를 막기 위해서, 이전 16프레임의 Luminance값을 저장하고 있다가, 그 값과 비교하여, 변경되었다고 판단될 경우에만 luminance를 갱신 16Frame의 Lumiance를 저장하기 위해서 4x4 렌더타겟이 필요
Middle Grey 날씨의 변화나 시간에 따라, 이 값이 변화될 필요가 있다. 현재 장면의 Luminance가 0.36이고, middle bright value가 0.18이라고 한다면, 최종 이미지의 luminance value는 원본 이미지의 절반의 값의 범위가 되는 것이다. (노출 정도라고 봐도 된다.) 날씨의 변화나 시간에 따라, 이 값이 변화될 필요가 있다. Middle grey는 일반적으로 0.18 자동으로 구할 수도 있다. (Auto Exposure)
Tone Mapping Operator 실제 LDR로 변환하는 과정을 처리하는 연산자 어떤 톤 매핑 연산을 사용했느냐에 따라 느낌이 다름 Reinhard가 발표한 공식에서 발전하기 시작 Star Ocean 4 에서는 공식이 아니라, 실제 카메라의 C-MOS 정보 등을 기초로 하여, Flim 스럽게 만들기도 함. Uncharted2에서 Flimic Tonemapping을 언급하면서 화두!! Tone Mapping Operator Reinhard (+Modified) Flimic Uncharted2
Reinhard Reinhard Reinhard(Modified) LumScaled : 이전에 구한 노출 정도 Reinhard(Modified) 흰색의 경우, 매우 밝게 조절된 형태로 원할 수도 있기 때문에, 새로운 공식이 등장 흰색은 LDR 이미지를 톤매핑할 때, 명암의 감소를 최소화 한다. 이는 White Clamping이라고 부르기도 한다. “Interactive Time-Dependent Tone Mapping Using Programmable Graphics Hardware” 최종 색상을 결정할 때, 아래와 같이 Saturation을 적용 LumCompressed * pow(color / pixelLuminance, LUMINANCE_SATURATION);
Flimic John Hable이 Unchated2 HDR Lighting 발표 문서에서 소개한 내용 Flim에서의 색상 Curve가 더 나은 결과를 보여준다는 것에서 착안 Reinhard와 비교 Reinhard가 상대적으로 Grayish
Flimic Tone Mapping x = max(0, LinearColor-0.004); pow(x,1/2.2) 가 포함되어 있다. 즉, Gamma Correction을 위해, Albedo 텍스쳐를 읽을 때, pow(x, 2.2)를 해주었다면, 모니터로 보낼 때, pow(x, 1/2.2)를 해주어야 하 지만, 이 공식에는 Bake되어 있기 때문에, 별도의 과정이 필요없다. 하지만, 일반적으로 마지막 패스에서 pow(x, 1/2.2)를 해주기 때 문에, 이 공식을 사용할 경우, 결과에 pow(1, 2.2)를 해주어서, 최 종 패스에서 처리하는 결과와 맞춰주어야 한다. x = max(0, LinearColor-0.004); GammaColor = (x*(6.2*x+0.5))/(x*(6.2*x+1.7)+0.06); [Uncharted 2 : HDR Lighting]에서 발췌
Uncharted 2 John Hable의 Blog를 통해서, Fixed 된 버전이라고 소개. Gamma 보정을 최종적으로 적용해주어야 한다. (pow(x, 1/2.2))
Glare(Bloom) 하지만…… Bright Pass 특별히 복잡한 작업 공정이 필요하지 않음 Tone Mapping을 그대로 적용 Threshold를 적절히 조절 특별히 복잡한 작업 공정이 필요하지 않음 하지만……
Glare (Cont’) 실제 화상에서는 어지간히 강한 빛이 아니면, 큰 Glare가 나오지 않는다. 결과적으로 렌더링 화상의 Dynamic Range(DR)가 본래의 DR에 비해 충분하지않기 때문에, Threshold 값을 낮춤으로서 강제로 Glare를 만들기를 시도한다. 그 결과, Diffuse에서도 부자연스럽게 Glare가 나오는 현상과 색상 정보다 전부 타들어간 듯이 날아가 버리는 현상이 자주 발생한다. 뭔가 저렴해 보인다!!!!!! 즉, 적합한 HDR 연산을 통한 처리와 물리적인 라이팅이 뒷받침 되지 않는다면, 이런 문제가 발생하기 쉽다.
Tone Mapping Operation Pipeline Tone Mapping Operation
Pipeline(Cont’) 톤매핑을 선행해서, 이미 고휘도 부분을 추출한 상태이기 때문에, 순서가 변경되어도 특별히 부자연스러운 부분이 없다. 오히려, 연산량을 줄일 수 있는 장점이 있을 것으로 보임
기타 효과 Vignette Blue Shift Grain Filter 카메라 렌즈의 구경에 따라 사진의 테두리 쪽으로 약간의 노이즈가 생기는 현상. 특히, 오래된 사진기일 수록 많이 발생 Blue Shift 매우 낮은 밝기가 되어, 작은 수의 간상체(rod)가 남게되고, 추상체(cone)이 주 광자 수용체가 되게 되면, 파란색 색조로 색상 전환이 이루어 진다. Grain Filter 어두운 곳으로 가면, 눈에 들어오는 광자가 적어지는 까닭에 노이즈가 심하고 전반적으로 디테일이 떨어지는 현상도 발생한다. 어두운 곳에서 사진을 찍으면, 화면이 깨진 것 같은 느낌!
Channel-Based Color Correction Levels Photoshop에서의 Levels command Gamma, contrast, 전체 이미지의 dynamic range를 수정하거나 독립적으로 채널 색상에 대한 속성들을 조정할 수 있다. Curves 생략
결론 실제 작업해보면, 위의 내용들이 대단히 쉽지 않은 과정임을 알 수 있음. 공부해둬야 할 것도 한 트럭!! 하지만, 향후 렌더링 프로세스 전반에 영향을 주는 가장 기본적이고 중요한 작업 과정 이것은 끝이 아닌 시작!! Tone Mapping Operator의 경우, 어떤 것이 좋은 지는 결과를 보고 각자 판단하는 것이 좋을 듯. 파이프라인이 길어서, 컨트롤할 Parameter들이 많으니, 비교적 많은 테스트가 필요. Parameter들에 대한 결과가 꽤나 민감함!!!
참고자료 “CrazyXIII : HDR”를 참고하시오!!! DirectX Sample “HDR Lighting” Kasa 이전 발표 – “Conversion Color Space & Filtering” - 이창희
Q & A
다음 편 예고 “Physically Based Shading Model” SIGGRAPH10에서 발표된 내용 이전부터 이야기는 있었던 듯(By Tri-ace 社) 사실 HDR에 대한 정리 작업은 이 과정을 잘하기 위한 선행 작업이었음. Brief Glare를 조절하기 위해서, Threshold 값에만 의존하십니까? Threshold를 만지면, 전체 화면이 뭉개진다!!!! 이 문제는 물체가 가지는 dynamic range의 값 자체가 잘못 되어서 그런거임… 그럼 잘하려면?