'HDR 렌더링'에 해당되는 글 1건

  1. 2009.12.01 HDR(High Dynamic Range Rendering) 렌더링

아래에서 HDR 관련 자료 가져옴 41~51
http://allosha.tistory.com/41

2008-12-05 13:33:00
ゲームグラフィックス、コンピュータグラフィックスは共に、ディスプレイ装置に表示することが前提であったために、レンダリングパイプラインが、この「ディスプレイ基準」で組み立てられて来た経緯がある。ところが ...... >> Read more

(C) Mainichi Communications Inc. All rights reserved.



게임 그래픽스와, 컴퓨터 그래픽스는 모두, 디스플레이 장치에 보여지는 것이 전제(前提)되어 있기 때문에, 렌더링 파이프라인이, 이 「디스플레이 기준」으로 만들어져 왔다. 그런데, 현실 세계를 리얼하게 표현하려고 할 때는, 이것은 족쇄가 된다. 이 족쇄를 끊으려는 움직임을 근대 실시간 3D그래픽스에서도 볼 수 있다.

그것이 「하이 다이나믹 레인지 렌더링」(HDR 렌더링:High Dynamic Range Rendering)이다

본래는 학술적인 연구테마로서 성행했었던 「HDR」이라는 키워드가, 지금은, PC에서의 실시간 렌더링 뿐 아니라, 가정용 게임기의 그래픽스 표현으로서도 표준이 되고 있다.

이번회부터는 당분간, 이 HDR 렌더링이라는 테마에 대해서 보도록 하자.


HDR렌더링이란?

원래 HDR 렌더링이라는 것은 어떤 의미가 있는 것일까? 우선은 여기로부터 해설해 나가자.

「HDR 렌더링」의 정의로서는 「표시에 이용하는 디스플레이 기기의 휘도(밝기 또는 선명도 )/색역(색상 범위)의 한계에 얽매이지 않고, 폭넓은 휘도/색역으로 렌더링을 수행하는 것」이 된다.

현재의 PC에서 일상적으로 취급하는 색 표현은 RGB(빨강, 녹색, 파랑)의 삼원색이 각각 8비트 정수로 표현된 24비트 컬러, 즉 1,677만개의 색이 가장 친밀한 색 표현이라 할 수 있다.

이 디스플레이에 채용되고 있는 「1,677만개 색」이라는 것은, 인간이 한번에 눈으로 감지할 수 있는 휘도나 색의 대략적인 범위를 RGB 삼원색(빛)을 각각 256단계(0~255)로 해서 표현한 것이다(R256×G256×B256 = 16,777,216). 인간이 한 번에 볼 수 있는 휘도범위/색범위는 이 1,677만 단계의 분해능(分解能, 해상도)으로 표현하는 정도면 거의 필요충분하다고 하지만, 현실 세계를 그대로 재현하는데는 불충분한 상황이 온다.

아래 그림은 인간의 시각을 알기 쉽게 도해한 것이다.

시각(視覺)의 다이나믹 레인지. 간상체(간상세포, rod cell)는 어두운 빛을 느끼기 위한 시각 세포. 그리고 원추체(원추세포, cone cell)는 밝은 빛이나 색을 느끼는 시각 세포. 아래의 수치의 단위는 루미넌스(luminance)값(lum/m2)

<그림 설명>
(제목) 시각의 다이나믹레인지
달(月) 없음、달밤、여명、방안、햇빛
원추체、도(밝기 또는 선명도)


예를들면, 「태양광을 반사하는 설원(1E+6=106)」은 상당히 밝고, 「별이 떠있는 밤하늘이 지표를 비추는 밝기(1E-6=10-6)」는 상당히 어두운 것을 상상 할 수 있을 것이다. 이 밝기나 어두움은 루미넌스값(lum/m2)에서는 실제로 10의 12승(1012)의 "격차(간격)"가 있다.

3D그래픽스는 루미넌스값으로 렌더링 하는 것은 아니지만, 그래도 현실 세계의 밝기와 어두움을 에너지로서 기록하려면 터무니없는 표현영역이 필요해 진다는 것은 상상할 수 있을 것이다.

앞에서 말한 설원과 밤하늘의 예가 현실 세계의 최대의 밝기와 어두움을 나타내고 있다고 가정하면, 이것을 수치로 표현하려면 1012의 범위를 표현할 수 없으면 안된다는 것이다.

이야기를 알기 쉽게 하기 위해서, 「취급할 수 있는 수치의 범위」라는 의미에 있어서의  "다이나믹 레인지"를 계산해 보자 (용어의 정의로서의 "다이나믹 레인지"라는 건 표현할 수 있는 최소값와 최대값의 대비를 나타내는 단위이다).

Log를 취해 10을 곱한 것을 dB(데시벨)이라고 하는데, 1012의 표현폭이 필요하다는 것은 120dB의 다이나믹 레인지가 필요하다는 것이 된다.

이른바 1,677만개의 색은 휘도를 8비트 정수, 즉 256 단계로 기록하는 방식이므로 256≒102.4  가 되어, 약 24dB 만큼 밖에는 기록할 수 없게 된다. 그래서, 현실 세계(120dB)의 약 40억분의1(≒1012÷102.4) 만큼 밖에는 기록할 수 없다는 것이다. 물론, 1012의 폭의 계조(階調, 단계)를 8비트의 256 단계로 무리하게 표현하는 것도 가능은 하지만, 이것은 분해능(分解能, 해상도)으로서는 너무 엉성하다.

이 광대한 다이나믹 레인지의 밝기, 어두움을, 가능한 정확하게 기록하려고 하는 것이 HDR 렌더링의 기본적인 접근(법)이다. (계속)


현실세계를 기록하는데 필요한 다이나믹 레인지란?

거기서, 다이렉트X 9 세대 / SM2.0 대응 GPU의 시대에, HDR 렌더링을 실현하는데 필요한 120dB 정도의 수치표현  능력을 가진 프레임 버퍼 포맷으로 제공된 것이, 각 RGB가 16비트 부동소수점(FP16)으로 표시되는 포맷이다.

FP16은 부호 1비트, 가수10비트, 지수 5비트로 구성되는 부동 소수점 포맷이다. 표현 범위는 (2의 10승)×(2의 32승) ≒ 4.4×10^12, 즉 다이나믹 레인지가 120dB이 되어 (지수5비트=2^5, 즉 32), 다이나믹 레인지로서 현실 세계의 상당한 비율의 휘도 범위를 기록할 수 있는 잠재력이 있다는 것을 알 수 있다.

컴퓨팅 세계에서 부동 소수점 표현이라 하면, 「단정도(單精度, Single-precision, 1개 메모리 단위로 수치를 저장)」라고 불리는 32비트 부동 소수점(FP32)과, 「배정도(倍精度, Double Precision, 2개 메모리 단위로 수치를 저장 )」라고 불리는 64비트 부동 소수점(FP64)이 일반적이지만, 이 FP16은 주로 그래픽스용으로서 제창된 것이다. 덧붙여서, 이 제창자는 SF영화 「스타워즈」의 특수 효과로 친숙한 ILM(Industrial Light & Magic)의 CG파트(팀)이고, FP16은 이 ILM이 제창한 HDR영상의 오픈소스 규격 「OpenEXR」안에 정의되어 있다.

단정도(1배 정밀도) FP32는 부호부 1비트, 지수부 8비트, 가수부 23비트로 구성되는 부동 소수점 포맷이므로, 표현 범위는 (2의23승)×(2의256승) = 9.7×10^83이며, 다이나믹 레인지는 830dB로, 이쪽은 반대로 지나치게 오버스펙이 나 버린다.

그러한 내막이 있어서, 최신세대의 GPU에서는, αRGB가 각각 FP16으로 표시되는 64비트 버퍼(16비트×4, 이하 FP16-64비트 버퍼)가, 실시간 3D그래픽스용, 3D게임용의 표준 HDR 렌더링용 버퍼 포맷으로 되어 있다.

단, 종래의 αRGB가 각각 8비트 정수인 32비트 버퍼(이하, int8-32비트 버퍼)와 비교하면 2배의 비디오메모리를 소비하기 때문에, 32비트 버퍼(int8-32비트 버퍼)와 동등한 퍼포먼스를 보이려면 단위시간 당 대역이나 버스 성능은 2배가 요구된다.

이것은 다이렉트X 9 세대 / SM2.0 대응 GPU 때에는, 부하가 상당히 심한 것이었지만, 최신세대의 다이렉트X 10  세대 / SM4.0 대응 GPU에서는, 현실적으로 문제 없이 활용할 수 있는 솔루션이 되고 있다.


HDR렌더링의 메리트란?

HDR 렌더링은, 현실 세계에 가까운 다이나믹 레인지 정보를 거의 그대로 기록해 나가는 렌더링 기법이라는 것이라는 것은 상상할 수 있을 것이라 생각한다.

그렇다고 해도 「그것이 대체 어쨌다는 거냐?」라는 의문도 들지 모르겠다. 하이 다이나믹 레인지로 렌더링 했다고는 해도, 표시해주는 디스플레이 장치는 종래의 1,677만 색으로 디스플레이하기 때문에, 그대로는 표시될 수 없다.

FP16-64비트의 HDR버퍼에 HDR 렌더링을 했지만 결국, 표시할 단계에서 int8-32비트에 해당되는 LDR버퍼에 뭉쳐넣어서 감색처리해야 하는 것이다.

그렇게 되면, HDR렌더링의 메리트는 도대체 어디에 있는가?

그것은, 주로, 지금부터 소개할 3가지 요소에 있다.

(1)음영이 보다 리얼해 진다. (2)노출 시뮬레이션을 할 수 있다. (3)눈부심 표현이 가능하다.


HDR렌더링의 첫번째 효능 ~ 음영이 보다 리얼해 진다

HDR렌더링의 첫번째 효능은, 음영이 보다 리얼하게 된다는 것이다.

예를 들면, 빛을 별로 반사하지 않는 재질로서 도로 노면의 아스팔트를 예로 들어 보자.

도로의 재질로 알려진 아스팔트의 빛의 반사율은 불과 7%정도라고 한다. 이것은 「거의 반사하지 않지만, 전혀 반사하지 않는 것도 아니다」라고 할 만큼의 반사율이다.

예를 들면, 일반적으로 유통되고 있는 αRGB 각각 8비트 정수의 1,677만 색모드에서, 8비트 정수 표현으로 가장 밝은 255의 7%는 약 18이 된다. 즉 RGB가 모두 255인 백색광(白色光)으로 라이팅 해도, 그 음영 처리 결과는 RGB가 모두 18 이라는 상당히 어두운 색, 즉 계조(단계)가 되어 버리는 것이다.

8비트, 즉 256 계조(단계)에서 18은 이렇게 어둡다(이미지)

그러나, 현실 세계에서는, 고휘도의 태양광을 받은 노면은 둔하게 빛나 보인다.

이것은 3D그래픽스로 옮기면, 광원인 태양이 디스플레이로 표현되는 최고 휘도인 RGB = 255이 아닌, 터무니 없이 높은 휘도값을 가지고 있기 때문이다.

HDR 렌더링은, 이러한 「RGB가 모두 255로 한계점 도달」이라는 제약을 제거해 버리는 것이므로, 종래의 렌더링 기법에서는 아무리해도 묻혀 버리고 마는 음영을 부상(浮上) 시키는 효과를 기대할 수 있다.(계속)

 

「HalfLife2:Lost Coast」(VALVE,2005)로 부터. LDR 렌더링에서는 이와 같이 전체가 어둡다


  HDR광원을 사용한 HDR 렌더링에서는, 이와
  같이 파묻힌 음영이 보이게 된다. 그림으로서
  는 전체가 밝아진 것 같은 느낌이 든다. 덧붙여
  「HalfLife2:Lost Coast」에서는, 렌더링에
  FP16-64비트 버퍼를 렌더타겟으로 사용했다



HDR렌더링의 두번째 효능 ~ 노출 시뮬레이션을 할 수 있다

첫번째 효능은, 묻혀 있는 낮은 반사율의 음영이 보이게 된다……라고 하는 알기 쉬운 예였지만, 반대로, 높은 휘도의 광원에서 고반사율의 재질(금속과 같은 거울반사등)에서는 당연히, 음영처리 결과는 디스플레이 표시색의 범위를 넘는 색(휘도)이 되어 버린다. 현재, 일부의 메이커로부터 하이 다이나믹 레인지 디스플레이 장치라는 것이 발매되기 시작했지만, 아직은 고가이고 일반용은 아니다.

따라서, HDR렌더링에 의해서 생성된 프레임(영상)을, 일반적으로 보급되어 있는 디스플레이에서 표시하려면, 아무래도 「표시하기 위한 조정(≒감색)가공 처리」가 필요하게 된다. 이 처리계(處理系)는 「톤 매핑」(Tone Mapping)이라 불리고, 넓은 의미로는, 이 처리를 포함해 HDR 렌더링이라고 부르기도 한다.

구BRIGHTSIDE사(현재는Dolby가 매수)가 개발하고,  日商 Electronics사가 발매한 HDR 디스플레이 「DR37-P」. contrast比가 20만:1, 최대 휘도는 3000cd/평방미터


그런데, 앞에서 나왔던 「시각의 다이나믹 레인지」그림에서와 같이 인간이 지각할 수 있는 다이나믹 레인지는 80~120dB 전후라고 한다. 그러나, 실제로 한번에 색으로 지각할 수 있는 범위는, 보고 있는 씬의 최대 휘도, 혹은 평균 휘도에 끌려가 버린다.

예를 들면 이런 경험이 있을 것이다. 휴대 전화를 실내에서 열었을 때는 액정화면이 잘 보이는데, 맑은 날의 옥외에서 열면 거의 안보인다. 휴대 전화의 액정 디스플레이의 밝기는 변함이 없는데, 보일 때와 안보일 때가 있다.

이것은, 인간의 눈에 있는 광채(Iris)라고 하는 부위가, 보고 있는 정경 전체의 휘도에 적응해 닫히거나 열리거나 해서, 안구내로 통하는 광량을 조정하고 있기 때문에 일어나는 현상이다. 실내에서는 광채가 열려 망막에 빛을 많이 들어오므로, 액정화면의 빛도 밝게 보이지만, 옥외에서는 광채가 좁혀져 망막에의 광량이 줄어 들어, 액정화면 정도의 휘도에서는 망막에 닿기 어렵게 되는 것이다.

HDR렌더링에서는, 매우 어두운 휘도 영역으로부터 매우 밝은 휘도 영역까지의 음영을 올바르게 버퍼에 기록하고 있으므로, 그 씬의 평균 휘도를 구하고 나서, 그 값을 중심으로 톤 매핑을 실시하면 그 씬을 적정 휘도로 볼 수 있다. 물론, 적정 휘도 범위 이하의 계조는 죽어서 검은색으로 떨어지거나 범위 이상의 계조는 흰색으로 날아간다거나 해 버리지만, 실제 우리의 시각도 그렇기 때문에, 리얼한 시야를 재현한다는 의미에서는, 그것은 오히려 안성마춤이다. 이 톤매핑 공정은, 눈의 광채가 보기 편한 조리개로 보는 동작을 흉내낸 것과 같다.

덧붙여 이 톤매핑을 매프레임 단위로 순간에 실시하는 것이 아니라, 약간의 지연을 수반해서 서서히 실시하면, 한층 더 리얼리티가 증가한다.

현실 세계에서도, 어두운 방으로부터 밝은 옥외로 뛰어 나오면, 일순간 눈이 먼 눈부심에 싸이는데, 점차 눈이 익숙해져서 적정한 휘도 밸런스로 정경이 눈에 들어오게 된다.

이, 적정 휘도로 조정하는 동적인 톤매핑 처리를, 일부러 약간의 지연을 수반해 실시해 주면, 「밝기/어두움에 눈이 익숙해져 간다」라는 모습을 표현할 수 있다.

이러한 동적인 톤 매핑 처리는, 눈으로 말하면 광채, 카메라로 말하면 「조리개」제어에 해당되, 이러한 광량 조정에 의한 명암의 컨트롤은 카메라 용어에서 말하는 「노출 보정」에 가깝다.

HDR렌더링의 두번째 효능은, 이러한 노출의 시뮬레이션을 실시할 수 있다는데 있다.(계속)

 

「HalfLife2:Lost Coast」(VALVE,2005)로 부터. 어두운 옥내에 눈이 익숙해져 있는 상태.

  이대로 옥외에 뛰어 나오면 옥외의 정경이
  눈부시게 보인다.

 

점차 눈이 익숙해져 오지만 안쪽의 석벽의 하이라이트는 역시 눈부시게 보이고 있다.

  겨우 석벽의 하이라이트의 음영이 올바르게
  보여 온다. 이것으로 옥외에 노출이 적정한
  상태가 되었다



HDR렌더링 세번째 효능 ~ 눈부심의 표현이 가능해 진다.

인간의 눈이나 카메라로 고휘도의 것을 보면, 그 빛이 포화되어 보이는 시각 효과를 얻을 수 있다. 이것은, 비록 앞에서 말한 노출 보정이 제대로 되고 있어도, 극단적으로 밝은 곳은 그렇게 보인다.

또, 그 고휘도인 물체의 모습의 대부분이 차폐물에 차단되 있어도, 고휘도 물체가 일부라도 차폐물로부터 머리를 내밀고 있으면, 차폐물과의 전후관계를 초월해, 강한 빛이 이쪽으로 새어 나오는 것처럼 보인다.

친밀한 예로, 여름 낮에, 나무 그늘에서 하늘을 올려다 보면, 가지나 잎 너머로 태양을 보면, 가지나 잎의 차폐를 넘어서 빛이 확하고 방사상으로 퍼져 보이는 체험을 했을 것이다.

이것은 극히 휘도가 높은 빛이 렌즈 안에서 반사된 결과이거나, 눈의 첩모(속눈썹)에서 빛이 회절(回折) 하거나(꺾이거나) 하는 현상이, 그렇게 보이도록 만들고 있는 것이라고 한다.

HDR렌더링의 세번째 효능은, 이런 고휘도 부분의 표현을 고안하는 것으로, 영상으로서의 리얼리티, 인간의 시각으로서의 리얼리티를 연출할 수 있다는 점에 있다.

다만, 이런 "눈부심"의 표현은, 광학 현상을 올바르게 시뮬레이션하는 구현이라기 보다, 아티스트나 3D그래픽스 엔진 설계자의 센스에 근거해서, 화상 처리적인 접근으로 구현된 기법이 주류로 되어 있다.

가장 대표적인 것은, 고휘도 부분으로부터 빛이 희미하게 넘쳐나오는 표현으로, 이것을 특히 「Light Bloom」이라고 부르거나 한다.

또, 수면의 잔물결에 반사된 빛등이 방사상(放射狀)으로 빛이 포화되어(넘쳐) 나오는 표현은 「Glair」라고 나누어 부르거나 한다.(계속)

 

「DeusEx 2」(ION STORM,2004)으로 부터. 라이트 Bloom 없음.

  라이트 Bloom 있음. "있음"이면 씬의
  고휘도 부분으로부터 희미한 빛이 흘러
  나온 것 같은 부드러운 이미지의 영상이 된다


「3DMark06」(Futuremark,2006)으로 부터. Glair의 예. 호수면에 비친 태양으로부터의 고휘도 빛이 방사상으로 넘쳐 나오고 있다


HDR렌더링의 역사

HDR 렌더링의 기본적인 개념을 알았으니, 최근까지의 HDR 렌더링의 기술 동향을 간단히 돌아 보자.

앞절까지, HDR렌더링은 FP16-64비트 버퍼와 같은 부동 소수점 버퍼를 활용해 실시하는 것……이라는 논조로 해설해 왔다. 부동 소수점 버퍼 구현은 다이렉트X 9 세대 / SM2.0 대응의 GPU 이후 이므로, 그 전에는 HDR 렌더링의 구현은 없었을까? 라고 하면 실은 그렇지 않다.

그보다 조금 앞서서, 「의사적인 HDR 렌더링」이라는 접근방법이 3D게임에 실제로 구현된 예가 있다.

이 기술로 주목을 끈 것은, Xbox용 게임으로 발매된 「DOUBLE S.T.E.A.L」(분카사, 2002년)이다. 이 게임은 일본에서 개발 되었고, 유사 HDR 렌더링이었지만, 그 후의 진짜 HDR 렌더링의 구현에도 응용할 수 있는 많은 기초 기술을 확립했던 게임이였다.

Xbox의 GPU는 다이렉트X 8 세대 / SM1.x 대응이였고, FP16-64비트의 부동소수점 HDR버퍼는 없었기 때문에, 통상의 int8-32비트의 정수 LDR 버퍼를 독특하게 사용해 유사 HDR 렌더링 테크닉을 구현했다. 구체적으로는 αRGB 중, α성분에 8비트/256단계에서는 표현할 수 없는 고휘도 정보를 저장해서 실현했다.

이 유사 HDR 렌더링 기술에 대해서는 본연재의 후반부에서 해설할 예정이다.

「DOUBLE S.T.E.A.L」(분카사, 2002년)로 부터. 3D게임에서 HDR렌더링의 원조격인 존재

2002년 후반에, DirectX 9 세대 / SM2.0 대응 GPU가 등장해, 부동 소수점 버퍼가 지원 되었지만, 멀티샘플 안티-에일리어싱 (MSAA:Multi-Sampled Anti-Aliasing) 처리를 적용할 수 없다는 제약 때문에, 실제로는, 이후에도 당분간, 3D게임의 HDR렌더링은, 「DOUBLE S.T.E.A.L」적인 유사 HDR 렌더링 구현이 주류였었다.

2004년에 「본격적인 HDR 렌더링을 구현했다」라는 선전과 함께 등장한 3D게임 「HalfLife2」(Valve,2004)에서도, α값에 RGB에서 공통으로 이용하는 스케일치(배율치)를 넣고, 각 RGB 값을 X=X×α×16 으로 디코딩하는 유사 HDR 렌더링에 지나지 않았다. 그로 인해, 동적인 톤매핑은 구현되어 있지 않았고, 환경맵 등도 HDR 정보는 잘라 버리는 간이 구현이였다.

「HalfLife2」(Valve,2004)로 부터. 하늘의 태양은 HDR정보가 활용된 Bloom을 일으키고 있는데 수면에 비친 태양은 어두워져 있다. HalfLife2는 텍스처에는 HDR 정보가 반영되지 않았다

2004년에는 다이렉트X 9 세대 / SM3.0 대응 GPU가 발표되어 FP16-64비트 버퍼의 블렌딩이 지원되는 등, 그 실용성도 높아졌다. 이 영향으로 2005년 경이 되자 서서히 FP16-64비트 버퍼를 활용한 HDR렌더링을 구현한 3D그래픽스 엔진도 서서히 등장하기 시작했지만, 주류는 되지 못했다. 그것은, FP16-64비트 버퍼에 대한 안티-에일리어싱 처리에 대응한 GPU가 ATI(현AMD)의 Radeon X1000시리즈로 한정되었고 경쟁사인 NVIDIA의 GeForce 6000/7000 시리즈에서는 지원하지 않았기 때문이다.

2006년이 되자, FP16-64비트 버퍼를 활용한 HDR렌더링에 대한 연구가 진행되어, 이것을 구현한 3D게임 그래픽스가 많아졌다. 이것은, 2005년 말에 발매된 Xbox 360의 영향도 적지 않았다고 생각된다. Xbox 360의 GPU는 다이렉트X 9 세대 / SM3.0 대응의 GPU로, 3D게임 그래픽스의 설계가, 이 다이렉트X 9 세대 / SM3.0 대응의 GPU를 전제로 한 것이였기 때문이다.(계속)

「AGE OF EMPIRES III」(ENSEMBLE STUDIOS,2005)는 메인스트림인PC게임 작품으로서는 처음으로 FP16-64비트 버퍼에 의한 HDR 렌더링을 사용한 타이틀이 되었다



PS3의 GPU「RSX」는 NVIDIA의 GeForce 7800 GTX를 베이스로 설계되었기 때문에, FP16-64비트 버퍼에  대한 MSAA를 사용할 수 없는 제약 또한 계승해 버렸다. 코나미의 PS3 전용 타이틀 「메탈 기어 솔리드4」(2008년)에서는, 이 제약과 Fill Rate을 고려해, FP16-64비트 버퍼의 채택을 단념했다.

CEDEC 2008의 슬라이드로 부터.「메탈 기어 솔리드4」에서는 32비트 정수 버퍼의 HDR 렌더링을 사용했다.

<그림 설명>
좌:
HDR렌더링의 필요성(2)
당초에는 FP16 버퍼에 의한 렌러링
- Fill Rate이 부족하다
- MSAA를 사용할  수 없다.
- FP16 버퍼에 의한 렌러딩을 단념
우:
HDR 인코더 렌더링(1)
MGS4에서는 HDR 인코드 채용
- 32비트/픽셀의 Band Width에서 HDR을 실현
- HDR 인코드 렌더링에도 몇개의 문제점
  ㆍ휘도레인지, 정밀도 부족
      MGS4에서는 그정도로 문제는 되지 않았다.
  ㆍ반투명의 직접 렌더링이 불가능


또한, 약간 변칙적인 수법이지만, 「Half-Life2」의 개발사인 VALVE는, 이 FP16-64비트 버퍼에 대한 제약을 피하면서, FP16-64비트 버퍼에 대해서 HDR 렌더링을 하는 테크닉을 발표했다.

이 VALVE의 구현에서는, 텍스처나 렌더링을 FP16-64비트 버퍼로 하지만, Bloom 효과나 Glare 효과의 처리 전에 톤매핑을 실시해서 32비트의 LDR 버퍼로 해 버린다.

              VALVE가 구현한 타협안적인 리얼 HDR 렌더링

이 방법에서는, Blooming 효과나 Glare 효과를 처리하는 시점에서는 HDR정보는 완전히 잃게 되지만, LDR(RGB가 0~255)버퍼 속에서 고휘도 영역(예를 들면 RGB가 평균 240 이상 등)을 추출해, 거기서부터 Bloom 효과나 Glare 효과를 생성한다. 반사나 굴절한 정경(동적 생성되는 환경 큐브 맵 등)에 대해서도, 렌더링 자체는HDR 차원에서 행해져 그 씬에 적합한 톤매핑을 하기 때문에, HDR정보는 분명히 잃게 되지만, 뒷단계의 Bloom 효과, Glare 효과도 모순 없이 나온다고 한다. 엄밀한 HDR 렌더링 순서로서는 전혀 올바르지 않은 것이지만, 대체로 부자연스러움은 없다고 한다.

톤매핑 된 후의 LDR프레임

여기부터 고휘도부를 뭉개서 Bloom 효과 프레임을 생성


이것들을 합성


이 방식의 메리트는, 블렌딩, MSAA등을 LDR 버퍼에서 할 수 있다는 것. 즉, FP16-64비트 버퍼로 MSAA를 사용할 수 없는 다이렉트X 9 세대의 GPU에서도 호환성이 보증된다는 것이다. 이 타협안적인 리얼 HDR 렌더링은 「Half-Life2:LostCoast」(VALVE,2005), 「Half-Life2:EPISODE ONE」(VALVE,2006)에서 사용되었다.

타협안적 리얼 HDR 렌더링 기법을 구현한 「Half-Life2:LostCoast」(VALVE,2005)로 부터. 왼쪽이2004년의 오리지널 「Half-Life2」시대의 유사 HDR 렌더링. 오른쪽이 타협안적인 리얼 HDR 렌더링에 의한 것. 오른편은 수면에 비친 태양도 제대로 Bloom 효과가 나오는 것을 알 수 있다.


2007년에 발매된 윈도우즈 비스타와 거의 동시에 제공된 다이렉트X 10 세대 / SM4.0 세대의 GPU에서는 FP16-64비트 버퍼, FP32-128비트 버퍼에 대해서도 MSAA 처리를 적용할 수 있게 되어, 이상적인 HDR렌더링의 공정이 모든 메이커의 GPU에서 구현될 수 있게 되었다.

이렇게 보면, 2002년 경 부터 시작된 유사 HDR 렌더링의 기간이 의외로 길고, 최근이 되어서야 드디어 이론대로의  진짜 HDR 렌더링을 구현할 수 있게 되었다는 것을 알 수 있다.(계속)


여기부터는, HDR렌더링은, 구체적으로 어떤 프로세스로 실현되는지를 해설해 나가고 싶다.

처음에는 전체적인 흐름을 보고 나서, 그 요소 요소에서의, 구현에 필요한 각종 기술들을 소개해 나가고 싶다. 덧붙여, 각 포인트에서는, 오랫동안 주류가 되어 온 「유사 HDR 렌더링 기법」과, 앞으로 주류가 될 「리얼 HDR 렌더링 기법」양쪽 모두를 언급하고 싶다.


HDR렌더링의 프로세스

HDR 렌더링은, 렌더링을 HDR 차원에서 수행하는 것이 기본 컨셉이 된다.

지난회 까지에서 종래의 αRGB 각 8비트의 int8-32비트의 정수 버퍼로 유사하게 HDR 렌더링을 하는 유사 HDR 렌더링과, αRGB 각 FP16비트의 FP16-64비트의 부동소수점 버퍼로 실시하는 리얼 HDR 렌더링이 있다는 것은 이야기했다. 또, 후반에는 VALVE가 「Half-Life2:EPISODE TWO」에서 구현한 타협안적인 리얼 HDR 렌더링에 대해서도 소개했다. 지금까지 소개한 여러가지 접근의 HDR 렌더링 스타일은 어쨋든, 이론을 이상적으로 구현한 HDR 렌더링은 그림1과 같은 흐름이 된다.

                                그림1: HDR 렌더링의 이상적인 렌더링 파이프라인

<그림 설명>
(박스 좌) HDRテクスチャ(HDR 텍스처)、HDR高原(HDR 광원)、HDRレンダーターゲット(HDR 렌더타겟)、
(박스) HDRフレームバッファ(HDR 프레임버퍼)、
(버블) 동적인 환경맵 등을 이용
(박스) HDRブルーム/グレア(HDR Bloom/Glare)、
(박스) トーンマッピング (톤매핑)
(박스 우) 表示(표시)
-> αRGB가 각각 16비트인 HDR
-> αRGB가 각각 8비트인 LDR


이 그림을 해설하도록 하자.

좌측 맨아래의, 「HDR 렌더타겟」……즉 HDR렌더링에 이용하는 버퍼는, FP16-64비트 버퍼가 표준이 된다. 앞세대의 다이렉트X9 세대, SM2.0/SM3.0 대응 GPU에서 완벽하지 않았던 FP16-64비트 버퍼의 렌더타겟에 대한 멀티샘플 안티에일리어싱(MSAA) 처리가, 다이렉트X10 세대/SM4.0 대응 GPU에서는 동작이 보증되었기 때문에, 비디오메모리 점유량 증가, 메모리 버스 소비를 제외하면 사용 용이성은 거의 int8-32비트 정수 버퍼와 다르지 않은 레벨로 끌어 올려졌다. HDR 기록을 위해 필요한 다이나믹 레인지도, 리얼타임 3D그래픽스용으로서는 필요 충분하다.

좌측 가운데의, 「HDR광원」……은 HDR 렌더링에 이용하기 위한 광원으로, int8-32비트에 제한 받지 않는 고휘도 광원을 사용할 필요가 생긴다.

좌측 맨위의, 「HDR 텍스처」는, HDR 렌더링 시에 3D모델등에 적용하는 텍스처도 HDR포맷에 대응한다는 것……을 말하고 있다.

3D모델에 붙이는 화상 텍스처(Decal Texture)는, 통상의 int8-32비트의 LDR 텍스처라도 상관없지만, 주위의 비쳐지는 정경을 나타내는 환경 맵이나, 텍스처 자체를 발광물(發光物)로서 다루는 「자체 발광 텍스처」에 대해서는 HDR 텍스처를 사용하는 것이 바람직하다. 구체적으로는 이 경우도 FP16-64비트의 텍스처가 이상적이다.

다만, FP16-64비트의 HDR 텍스처는 그대로는 압축을 할 수 없기 때문에 다루기 어렵다. 또, FP16-64비트의HDR 텍스처를 읽는 횟수는 퍼포먼스에 큰 영향을 주므로, 3D게임등의 경우는 비주얼 품질에 상당히 영향이 크다고 판단되는 텍스처 이외에는, int8-32비트의 LDR 텍스처에 HDR 정보를 담는, 말하자면 유사 HDR 텍스처를 이용하는 경우가 많은 듯 하다. 이 구현 방법에 대해서는 뒤에서 이야기 한다.

이렇게 해서, 「HDR 텍스처」나 「HDR 광원」을 이용해, HDR 렌더링을 수행해서 「HDR 렌더타겟」에 HDR 프레임이 생성된다. 완성된 프레임이 「HDR 프레임 버퍼」이다.

이후, 이 HDR 프레임을 검증해서, HDR프레임 안의 일정 휘도 이상의 고휘도 부분을 추출해서, Bloom이나  Glare 효과 프레임을 생성한다. 이것이 「HDR Bloom/Glare」의 처리계이다.

「HDR 톤매핑」은 HDR 프레임을 일반적인 디스플레이 기기에 표시하기 위해 처리를 하는 곳이다. 간단하게 말하면 감색처리와 같은 것이지만, 앞절에서 말한 것처럼 여기서 그 프레임의 평균 휘도등을 산출해(≒히스토그램을 구한다), 그 프레임에 적절한 휘도 밸런스로 조정하는 것으로, 눈이나 카메라의 자동 노출 보정 효과를 연출할 수 있다.

여기서 부터는, 이 그림1에서 보여진, HDR렌더링 파이프라인의 각 공정들에 대한 포인트들을 해설해 나가기로 하겠다.(계속)


호환성과 퍼포먼스를 중시한다면 유사 HDR 렌더링?

다이렉트X 10 세대 / SM4.0 대응 GPU에서는, FP16-64비트의 렌더타겟을 그냥 사용하면 된다. 폭넓은 다이나믹 레인지를, FP16-64비트라면 특별한 가공처리 없이 절대값으로 렌더링 할 수 있다.

그 이전의 다이렉트X 9 세대 / SM2.0~3.0 대응 GPU에서도, 호환성이나 퍼포먼스의 문제를 해결할 수 있다면, FP16-64비트 버퍼를 사용한다.

그렇지 않은 경우는, int8-32비트의 정수 LDR 버퍼를 이용한 유사 HDR 렌더링를 하는 것이 적합하다고 여겨진다.

8비트 정수이면 0~255의 값을 표현할 수 있지만, 보통, 이것을 0.0~1.0의 값에 대응 시켜 휘도를 표현한다. 이것을 예를 들면, 0~255를 0.0~2.0까지의 값으로 대응 시켜, 보통 때의 2배의 다이나믹 레인지(표현영역)를 가진다고 간주하는 것이다. 즉, 이미지적으로는 색 표현의 분해능(해상도)을 절반으로 하는 대신에, 휘도 표현을 2배로 한다…… 고 간주하고 렌더링을 하는 것이다. 즉, 보통의 LDR 렌더링에서는 최대로 밝은 255가  이 유사 HDR 렌더링 기법에서는128이 되는 것이다.

이대로 유사 HDR 렌더링을 모두 끝내고, 뒷단계인 Bloom/Glare 생성을 끝내고 톤매핑을 실시하면 폭이 127이였던 범위가 0~255의 범위로 되돌려지게 된다.

물론, 0~255을 0.0~4.0까지……와 같이 다이나믹 레인지를 한층 더 넓히는 것도 가능은 하다. 하지만, 뒷단계인 톤매핑 처리로, 폭이 63인 범위가 0~255로 되돌려지게 되어, 분해능(해상도)은 앞에서 이야기한 0.0~2.0의 경우 보다 더욱더 저하된다.

그 때문에, 이 기법을 사용하는 경우에는 「0~255→0.0~2.0」으로 하는 경우가 많은 것 같다.

앞에서 소개했던 유사 HDR 렌더링의 원조적 존재인 「DOUBLE S.T.E.A.L」이나, 「발키리프로파일2」(트라이 에이스,2006)등에서도, 「0~255→0.0~2.0」으로 한 유사 HDR 렌더링을 채택했다.(계속)

왼쪽에서 부터 0.0~1.0(보통), 0.0~2.0(2배의 휘도까지 대응한 유사 HDR), 0.0~4.0(4배의 휘도까지 대응한 유사 HDR). 2배에서는 약간, 4배에서는 심하게 유사 윤곽(마하 밴드)이 눈에 띈다.

위 그림에 화상 텍스처를 적용한 경우. 화상 텍스처를 적용하면 유사 윤곽은 시각적으로, 대부분 눈에 띄지 않게 된다. 특히2배에서는 잘 보지 않으면, 알지 못할 정도이다.
(화상 출처 = 트라이 에이스/Practical Implementation of SH Lighting and HDR Rendering on PlayStation 2/Yoshiharu Gotanda/Tatsuya Shoji/Research and Development Dept. tri-Ace Inc.)

지금도 유사 HDR 텍스처와 병용 하는 것이 주류

HDR 텍스처도, 다이렉트X 9 세대 / SM3.0 대응 이후의 GPU이면, 보통의 부동소수점 텍스처를 활용하면 문제는 없다. FP16-64비트 텍스처이면, 텍스처 필터링도 바이리니어로부터 이방성까지 모두 적용할 수 있다. 다이렉트X 10 세대 / SM4.0 대응 GPU가 아니면 FP32-128비트 텍스처의 필터링은 할 수 없지만, 일반적인 3D그래픽스의 렌더링에서 여기까지의 HDR 텍스처를 필요로 하는 상황은 별로 없을 것이다.

하지만, FP16-64비트 텍스처의 범용성 그 자체는 높지만, 커다란 문제도 있다. 그것은 비디오 메모리의 점유량과 읽어낼 때의 대역 소비가 크다는 것이다(렌더타겟 경우와 똑같은 문제).

αRGB 각 8비트의 int8-32비트의 종래의 LDR 텍스처이면, DXTC(DirectX Texture Compression)으로 불리는  텍스처 압축 방법를 이용할 수 있다. DXTC로 압축된 텍스처는, 압축된 상태인 채로 GPU 코어가 직접 액세스 할 수 있기 때문에, 활용하면 상당히 비디오메모리를 절약할 수 있다. 그러나, 부동소수점의 HDR 텍스처가 되버리면, 최신의 다이렉트X 10 세대 / SM4.0 대응 GPU 라 할지라도, 그 압축 방법은 지원되지 않는다.

3D게임 그래픽스에 있어서, 모든 텍스처를 HDR 텍스처로 하려면 , 비디오메모리 예산과, 대역 예산이 너무 커져버리기 때문에, 다이렉트X 9 세대 / 다이렉트X 10 세대에서도, LDR 텍스처를 유사 HDR 텍스처적으로 활용하는  경우가 많은 것 같다.

유사 HDR 텍스처는, 포맷으로는 LDR 텍스처이므로, DXTC를 이용해 효과적으로 압축할 수 있다.

포인트가 되는 것은, 어떻게 LDR 텍스처에 HDR 정보를 저장할까이지만, 이것에 대해서는 여러가지 테크닉이 고안 되어 있다.

여기에서는 「로스트 플라넷」(캡콤, 2007)에서 사용한 방법을 소개하겠다.

이 방법에서 이용하는 것은 α와 RGB값 모두 1/4로 압축된 DXT5 모드의 DXTC이다.

HDR로부터 LDR로의 변환(encode)은, 우선,{R,G,B,1.0} 중 최대값 M을 선택해, 그 역수 1/M을 α에 저장한다. 이어서 {R,G,B} 모두를 M으로 나눈 것을 RGB에 저장한다.

원래대로 되돌리는 디코딩 처리는 {R,G,B}={R,G,B}÷α만으로 구할 수 있다.

이것으로, 분해능(해상도)은 저하되지만, HDR의 다이나믹 레인지는 보존되고, 그 나름대로 RGB의 칼러도 보존된다.

HDR 텍스처라고 해도, 고휘도인 HDR값인 텍셀 보다는, RGB가 0.0~1.0의 LDR값인 텍셀들이 더 많을 것이다. 이 방법은, 그 계산 알고리즘의 특성상, 대부분을 차지하는 LDR값인 텍셀들의 보존품질이 높아지는 것이 특징이다.

또, 인코딩하면, HDR값으로 돌아오므로 FP16-64비트의 HDR 텍스처와의 혼용도 용이하다고 할 수 있다. 게다가 이 방법은, 고압축율인 DXT1 으로 압축한 LDR 텍스처를 동일 셰이더로 다룰 수 있다는 메리트도 있다.

DXT1은 α=0 아니면 α=1로 밖에는 이용할 수 없지만, α=1로서 LDR 텍스처를 DXT1으로 압축해 두면, 방금전의 DXT5의 유사 HDR 텍스처를 {R,G,B}={R,G,B}÷α로 디코딩했다고 해도 {R,G,B}={R,G,B}÷1 이므로, 앞뒤가 잘 맞는다.(계속)

HDR 텍스처를 유사 HDR 텍스처로서 LDR 텍스처로 변환. 그 나름대로 품질이 괜찮은 HDR 텍스처는, 이것을 이용하면 DXT압축을 할 수 있다.


넘쳐 나오는 빛을 생성하는 방법

Bloom 효과나 Glare 효과는, 렌더링 한 프레임 안에서의 고휘도 부분을 추출해서 실시하게 된다. 말하자면 Paint 소프트웨어에서 photo retouch를 하는 행위를 픽셀셰이더에서 하는 이미지다.

유사 HDR 렌더링으로 하든, 리얼 HDR 렌더링으로 하든, 하이 다이나믹 레인지의 휘도 정보가 각 화소에 기록되어 있으므로, 「어디부터가 고휘도인가?」를 판단하지 않으면 안 된다.

예를 들어 0.0~2.0까지의 휘도값을 저장하고 있다고 하고 폭 1.0의 범위를 표시하는 경우를 생각해 보자. 그 프레임이 1.0~2.0의 분포였을 때, 1.0은 가장 어두운 부분이 되지만, 역으로 0.0~1.0의 분포였을 때 1.0은 가장 밝은 부분이 된다. HDR 렌더링을 한 그 프레임의 평균 휘도를 구해, 어디 부터를 「고휘도이다」라고 판단할 수 있을지를 결정해 줄 필요가 있는 것이다. 이 처리에 대해서는 뒤의 톤매핑 해설에서 자세하게 다루기로 한다.

                                톤 매핑의 필요성

<그림 설명>
상:
0.0~2.0까지의 휘도를 기록하고 있을 때
중:
기록한 휘도값이 1.0~2.0일 때는 1.0이 가장 어둡다.
(버블) 어둡다!
하:
기록한 휘도값이 0.0~1.0일 때는 역으로 1.0이 가장 밝게 된다.
(버블) 밝다!


그 프레임에 대하여 「고휘도」라고 판단할 수 있는 「휘도 기준치」를 얻을 수 있었다면, 그 값 이상의 휘도의 화소를 다른 버퍼에 추출해 준다.

이렇게 해서 "정제(精製)"한 고휘도 추출 프레임을 "원래 화상"으로 하고, Bloom 효과나 Glare 효과의 이펙트 화상을 생성하는 것이, 이 「HDR Bloom/Glare 효과」의 공정이 된다.

Bloom 효과는, 이 고휘도 부분이 지그시 "배어 나오는" 효과이면 되는 것이므로, 이 고휘도 추출 프레임을 뭉개는 처리를 해 주면 된다라는 방침에 생각이 미친다.

여기서, 포인트가 되는 것은 그 뭉개는(Blur) 방법이다.

뭉개 줄 때 사용되는 블러 필터로서 기본적인 것은 「가우스 필터」(Gaussian Filter)이다.

이것은 간단하게 말하면, 어느 픽셀에 시선을 집중했을 때에, 그 픽셀컬러를 밖으로 가면 갈수록 연하게, 옅게, 동심원 모양으로 흩트리는 처리계이다.

넓은 범위를 블러하기 위해서는, 대규모의 블러 처리를 반복해서 실시 할 필요가 있기 때문에 부하가 크다.

거기서, 고휘도 추출 프레임을 다운샘플링 해서 저해상도판의 고휘도 추출 프레임을 생성해, 이것에 대해서 적당한 규모의 가우스 필터를 적용해 주는 대안이 자주 이용된다. 저해상도판의 고휘도 추출 프레임은 해상도가1/2인 것부터 1/4, 1/8, 1/16, 1/32, 1/64과 같이 적당하게 복수개를 준비하는 것이 일반적이다.

Bloom 효과 자체에 그 정도의 고해상도 정보가 필요없는 경우는, 처음에 생성한 고휘도 추출 프레임을 원프레임 해상도의 1/4 단위로 해서, 거기서 부터 시작해 1/8, 1/16, 1/32, 1/64등의 저해상도판을 준비한다……라고 하는 약식 방법도 생각할 수 있다.

또한, 블러를 할 때는, 저해상도판의 고휘도 추출 프레임 만큼 어둡게 블러되도록, Gauss 필터 적용시의 픽셀 컬러의 감쇠율을 낮추어 준다.(Low-pass화)

1/4 x 1/4 (256x192 pixels)

1/8 x 1/8 (128x96 pixels)

1/16 x 1/16 (64x48 pixels)

1/32 x 1/32 (32x48 pixels)

1/64 x 1/64 (16x12 pixels)


단계적으로 해상도화한 고휘도 추출 프레임들에 대해서, 다른 감쇠율의 Gauss 필터를 적용 ※Practical Implementation of High Dynamic Range Rendering/Masaki Kawase / BUNKASHA GAMES/BUNKASHA PUBLISHING CO.,LTD로 부터


이렇게 만들어진, 블러를 해준, 해상도가 서로 완전히 다른 복수의 고휘도 추출 프레임들을, 바이리니어 필터를 적용해서 동일한 해상도로 확대해, 이것들을 합성해 주면, 멀리 가면 갈수록 연하고 큰 블러된 Bloom효과의 프레임을 얻을 수 있다.

「맨처음 고휘도 추출 프레임을 저해상도로 해주고, 합성시에는 원래의 해상도로 확대해서 되돌린다」……라고 하는 테크닉은, 본래라면 반복해서 흩트리지 않으면 실현될 수 없는 듯한 광범위한 블러를, 1회만의 블러 처리로 실현시키기 위한 테크닉이었다는 것을 알 수 있다. 물론 저해상도가 된 것으로 색과 해상도의 정보량은 격감되어 있는 것이지만, 외곽으로 가면 갈수록 색을 연하게 블러하는 것을 원했으므로, 해상도 역시 그리 중요하지는 않게 된다. 실제로, 눈에 보이는 품질도 그리 나쁘지는 않다.

같은 해상도로 확대해서 모두 합성

 

광범위하게 흐려져 나오는 효과 프레임 완성


이 기법은, 앞절에서 소개한 유사 HDR 렌더링의 원조인 「DOUBLE S.T.E.A.L」에서 구현되어 화제를 부른 테크닉으로 「축소 버퍼에의 가우스 필터」법으로 불리고, 현재는 널리 활용되고 있다. 덧붙여 이 테크닉의 고안자인 개발자의 이름을 붙여서 카와세식 MGF(Multiple Gaussian Filter)로 불리기도 한다.

덧붙여 정수 LDR 버퍼를 사용해 유사 HDR 렌더링을 구현한 「DOUBLE S.T.E.A.L」에서는, HDR 환경 맵이나 고휘도 텍스처의 α부를 휘도 정보 저장용으로 이용해, 이 정보를 효과적으로 활용함으로써, Bloom/Glare 효과의 처리를 효율적으로 할 수 있도록 했다.

씬의 렌더링 시에 이러한 HDR환경 맵이나 고휘도 텍스처를 적용하는 상황에서는, 그러한 α부로부터 휘도 정보를 꺼내서, 음영 계산을 이 휘도 정보에 대해서도 실시해, 렌더링 결과의 컬러와 함께 출력되도록 한다. 최종 렌더링 결과의 α에는, 유사 HDR 렌더링을 하면서도, 음영 처리의 결과로서 고휘도가 된 정보가 남기 때문에,  2차 반사 이후의 표현에서도 제대로 HDR 표현을 실현할 수 있다. 그리고, Bloom/Glare 효과의 공정에서는, 이 α정보를 이용하면 좋다.

유사 HDR 렌더링에서의 Bloom/Glare 효과/CEDEC2002 DOUBLE-S.T.E.A.L.에서의 리얼타임 CG 표현 기법 ※분카사 게임 개발 사업부 카와세 마사키로 부터


Glare 효과(광선, 스타 효과)도, 고휘도부의 "넘치게 하는 방법"이 다를 뿐, 원리는 Bloom 효과와 완전히 똑같다. 어떤 넘치게 하는 방법을 구현할까는 아티스틱한 센스에 맡길 수 있는 부분이다.

「스타 대양3」(트라이 에이스,2003)에서는, 고휘도 추출 프레임을 문질러서 회전시켜 블러해서, 이것을 합성시에는 회전을 원래대로 되돌려서 해상도를 맞추는 형태로 확대해서 합성하는 기법으로, 날카로운 광선의 Glare효과의 이펙트를 만들어 냈다.(계속)

「스타 대양3」(트라이 에이스,2003)으로 부터. 이 예에서는 4 방향, 십자상으로 빛이 넘쳐서 나오는 광선의 Glare 표현 생성의 흐름을 보여주고 있다.

<그림 설명>
왼쪽에서 부터:
(박스) 회전해서 압축
Glare효과 생성용 Work Buffer
(박스) 뭉개준다
(박스) 회전을 원래대로 되돌려 확대
프레임버퍼
(박스) 모두 합성

 

    「스타 대양3」(트라이 에이스,2003)에서의 광선


평균휘도를 어떻게 구할 것인가? 휘도변환을 어떻게 해 줄 것인가?

톤매핑은 평균휘도를 어떻게 구할 것인가, 어떤 방법으로 휘도변환을 할 것인가가 포인트가 된다.

지난회까지 해설한 것처럼, HDR렌더링을 해서 완성된 영상 프레임은 그대로는 표시할 수가 없다( 표시해도 의도한 대로 나오지 않는다).

거기서 필요한 것이, 표시에 적합한 휘도 레인지로 변환해 주는 처리, 즉 「톤매핑」(Tone Mapping) 처리이다.

카메라나 인간의 시각이 그렇듯, 올바르게 영상으로 지각할 수 있는 것은, 어느 일정한 휘도 범위에 한정되므로, 그 HDR 프레임의 평균 휘도를 구해, 그곳을 중심으로 일정한 휘도 범위로 변환해, 표시 가능한 영상을 생성한다.

톤매핑의 이미지. 카메라에서 이른바, 히스토그램을 산출해 이것을 바탕으로 노광조정을 실시하는 것과 유사한 이미지(※Practical Implementation of SH Lighting and HDR Rendering on PlayStation 2/Yoshiharu Gotanda/Tatsuya Shoji/Research and Development Dept. tri-Ace Inc.로 부터)

이 3개는 모두 동일한 씬의 영상들이지만, 어느 휘도를 기준으로 영상을 조정하는가에 따라서, 씬의 모습을 바꿀 수 있다. 이것이 「톤 매핑」의 기본적인 개념. (※Recovering High Dynamic Range Radiance Maps from Photographs/Paul Debevec으로 부터)


구한 평균 휘도가 어두우면, HDR 프레임 안의 어두운 색이라 할지라도 그 나름대로 밝게 보이게 할 수 있고, 표시 범위를 크게 넘어버린 휘도의 픽셀은 모두 흰색으로 포화해 버린다.

계산해서 구한 기준이 되는 평균 휘도값을 키(Key)로 해서, HDR 프레임 내의 픽셀 컬러들을 표시 가능한 1,677만색으로 가중치를 붙여 라운딩해 나가는 처리가 「톤매핑」의 처리인 것이다.

가장 단순한 것은, 평균 휘도를 중심으로 선형으로 변환하는 처리이지만, 일반적으로, 이 톤매핑에 이용하는 변환함수의 곡선이, 비선형적인 모양인 것이 실제의 시각에 가까워 더 리얼해 진다고 알려져 있다.

구체적으로는 휘도가 낮은 곳은 약간 들어 올린다는 기분으로 하고, 밝은 곳은 그만큼은 아닌……것 같은 변환 곡선이 좋다고 여겨진다. 비선형의 구현이 어려운 경우에는, 서로 다른 복수의 기울기의 선형 변환을 조합한 멀티 밴드식이 구현되어 지기도 한다.

가장 단순한 선형 변환

   이런 비선형 곡선이 자연스럽게 보인다고
   여겨진다


복수의 선형 함수를 조합해 비선형 곡선을 근사 하는 대안으로도 그 나름대로의 모양을 얻을 수 있다


「발키리 프로파일 2」(트라이 에이스, 2006)으로 부터. 선형 변환의 톤매핑에 의한 영상

3밴드의 선형 변환으로 비선형 커브를 근사 한 톤매핑에 의한 영상


키포인트가 되는 평균 휘도를 구하는 기법에는 몇가지 방법들이 고안되어 있다.

「Half-Life 2: EPISODE ONE」에서는, 연속하는 프레임에 대해서, 각 밴드의 히스토그램을 측정하는 방법으로 평균 휘도를 구하고 있다. 예를 들면 8밴드(8단계)의 히스토그램을 구할 때는, 처음은 완전히 까만색으로부터 1/8의 계조(단계)까지의 휘도를 가진 화소의 개수를 세고, 다음 프레임에서는 다음의 1/8 계조의 휘도를 가진 화소의 개수를 센다. 즉, 8프레임에 걸쳐서 전체 밴드의 히스토그램을 얻는다는 것이다. 물론 실시간 3D그래픽스인 이상, 1프레임 단위로 다른 영상이 되므로, 올바른 히스토그램은 될 수 없겠지만, 연속적인 프레임 간에는 서로 닮아 있으므로 큰 문제는 되지 않는다고 한다.

구체적으로 개수를 센 결과를 어떻게 반영시킬까인데, 그 개수를 세는 방법은 의외로 단순하다. 렌더링 시, 픽셀셰이더로 조사하고 싶은 휘도 레인지의 픽셀이 있으면 MRT를 사용해 대응하는 비표시의 스텐실 버퍼에 마크 한다. 이 스텐실 버퍼에 대해서 비동기의 occlusion query를 실행해서, 마크된 픽셀의 개수를 얻는 것이다.

프레임 단위로 계측하는 대상 휘도를 바꿔서, 복수 프레임에 걸쳐서 계측함으로써 히스토그램을 구하는 「Half-Life 2: EPISODE ONE」(VALVE,2006). 덧붙여 측정 대상은 화면의 중앙 가까이에로 한정한다는 가중치 방법도 사용하고 있다.

「Half-Life 2: EPISODE ONE」(VALVE,2006)에 의한 톤 매핑


평균 휘도의 측정 방법에는 다른 간단한 방법도 있다. 그것은 HDR 프레임을 다운 샘플링 해서 1×1 텍셀까지 축소해서 구하는 방법이다. 이 경우도, 이렇게 구한 평균 휘도 정보는 다음 프레임의 톤 매핑에 활용하는데 문제가 없다.

톤 매핑은 실시간으로 하는 것보다도, 약간의 지연을 수반해 가는 편이, 인간이나 카메라가 밝기에의 순응에 약간 시간이 걸리는 모습을 재현할 수 있어 좀더 리얼해 진다. 또, 복수 프레임에 걸쳐 실행하므로 Fill Rate도 절약 되는 부차적인 혜택도 얻을 수 있다.

축소 버퍼를 이용한 평균 휘도 계측




Posted by 노을삼킨별
,