실시간 렌더링에서의 색상

빛과 색의 기본적인 지식들

Author Avatar

Yongsik Im

  ·  7 min read

Light Quantities #

PBR(Physically-Based Rendering)등의 렌더링 기법을 이용해 현실적인 장면을 렌더링하려면 현실에 적용되는 물리적인 법칙들을 최대한 비슷하게 묘사해야 한다. 그 중에는 당연히 Shading을 위한 빛의 법칙들도 포함된다.
빛은 입자(Particle)와 파동(Wave)의 성질을 모두 가지고 있는데, 그래픽스에서는 빛을 조명과 재질의 상호작용으로서 사용하기 때문에 각 성질은 아래의 용도로 사용될 수 있을 것이다.

  • 입자: 굴절(Refresciton), 충돌(Collision), 반사(Reflection), 산란(Scattering), 차폐(Occlusion), 흡수(Absorption)와 음영 등
  • 파동: 색상(Color), 회절(Diffraction), 간섭(Interference) 등

완벽하진 않지만 간단하게 요약하면, 파동적 성질은 픽셀이 “어떤” 구성의 값을, 입자적 성질은 “어느 정도로” 가질지 결졍한다고 여길 수 있다. 본 포스트에선 색에 대한 이야기를 주로 할 것이기 때문에, 당연하게도 파동으로서의 빛을 주로 살펴볼 것이다.

기본적으로 빛은 전자기파(Electromagnetic waves)이며, 파장(Wavelength)에 따라 다양한 종류로 구분할 수 있다. 이 때 구분의 기준이 되는 파장의 범위는 감마선과 같은 nm(나노미터)단위 파장부터 ELF(Extremely Low Frequency)과 같은 수만 km에 이르기까지 매우 광범위하며, 이 중에서 인간은 대략 400nm ~ 780nm 정도의 파장으로 구성된 영역의 빛만을 시각적으로 감지할 수 있고, 그렇기에 이 영역 안의 빛들을 가시광선(可視光線)이라 부른다.

렌더링 장면을 사용자에게 보여주는 것은 디스플레이 장치의 각 픽셀들이 어떤 색상의 빛을 어느 강도로 표현할지 나타내는 것이므로, 이를 위해

  1. 빛의 양을 측정하고 이를 색으로 표현하는 방법
  2. 연속 데이터인 빛의 파장을 이산 데이터인 디지털 정보로 변환하는 방법

에 대해 알아야 하며, 첫 번째인 빛의 양을 측정하는 것 부터 시작하고자 한다.

Radiometry #

빛의 양은 ‘실제 물리적인 양’과 ‘인간이 지각하는 양’이라는 두 기준으로 측정할 수 있을 것이다. 물리적인 양을 측정하는 단위인 Radiometry는 한국어로 ‘방사 측정’, 혹은 ‘방사량’ 이라고 표현할 수 있다. 방사량을 측정하는 단위에 대해 먼저 제시한 후 각 단위의 의미를 살펴보자.

NameSymbolUnitsDescription
방사속(radiant flux)$$\Phi$$W (watt)단위 시간당 방사되는 빛의 양
방사 조도(irradiance)$E$$$W/m^{2}$$단위 면적당 방사속(단위 면적에 들어오는 빛의 양)
방사 강도(radiant intensity)$I$$$W/sr$$단위 입체각(Steradian)당 방사속(단위 입체각으로 들어오는 빛의 양)
방사 휘도(radiance)$L$$$W/(m^{2}sr)$$단위 면적 및 단위 입체각당 방사속

보통 방사속, 방사 조도 및 방사 강도에 대해서는 직관적으로 쉽게 이해할 수 있다. 그런데 방사 휘도(radiance)는 직관적으로 이해하기 어려워하는 경우가 많은데, 조금 더 쉽게(?) 표현해 보자면 단위 면적 및 단위 입체각당 방사속은 결국 수식으로 아래처럼 표현될 수 있으며, $$\frac{d\Phi}{dAd\omega}, (A=Area)$$

일반적으로 물체에 있어서 ‘면적’은 표면(Surface)을 의미할 것이므로, 치환해 표현하자면

표면에 입사되는 수많은 광선들 중 단위 입체각으로 입사되는 광선들의 방사속

을 의미하게 된다.

여기서 알 수 있는 점은 아래의 두가지가 있다.

  • radiance를 $\pi$만큼 적분하면 irradiance를 구할 수 있다.
  • 입체각 $\omega$를 아주 작은 단위(미소 입체각)로 표현해 ‘단일 광선’의 방사속으로 근사(Approximation)할 수 있다.

이러한 아이디어는 Image-based Lighting이나 Illumination 계산에 사용된다.

Photometry #

빛의 양을 물리적으로 얼마나 정확하게 측정하는지보다도 결국 렌더링된 화면은 인간이 보게 되므로, 인지적 측면에서의 빛의 양을 측정할 수 있어야 한다. Photometry는 ‘광도 측정’, 혹은 ‘광량’, 으로 표현할 수 있다. 스펙트럼 분포(SPD, Spectrial Power Distribution) 형태의 방사 단위에 CIE photometric curve를 곱해 광도 단위를 얻어낼 수 있다.
이처럼 단순히 곱함수로의 변환이 일어나므로 광량은 인간의 눈을 기준으로 한다는 것을 제외하면 방사량과 동일한 기준으로 측정되며, 다음과 같은 단위를 사용한다.

NameSymbolUnitsDescription
광도(luminous flux)$lm$$lumen$단위 시간당 광량
방사 조도(illuminance)$lx(lux)$$lm/m^{2}$단위 면적당 광량(단위 면적에 들어오는 빛의 양)
방사 강도(luminous intensity)$cd(candela)$$lm/sr$단위 입체각(Steradian)당 광량(단위 입체각으로 들어오는 빛의 양)
방사 휘도(luminance)$nit$$$cd/m^{2}$$단위 면적당 방사 강도

Colorimetry #

빛의 강도(양)을 알 수 있게 되면 이제 측정한 빛이 어떤 색으로 보이는지도 알 수 있어야 한다. Colorimetery(색도 측정)은 빛의 색을 측정하는 방법이며, SPD를 기반으로 해당 스펙트럼 분포를 가진 빛이 인간에게 어떤 색상으로 인지되는지를 알아내는 것을 목표로 한다. 인간은 약 1000만 가지의 색상을 구분할 수 있는데, 이는 눈 안에 존재하는 세 종류의 원추세포(원뿔세포, Cone Resceptor)의 역할 덕분이다.
각각의 원추세포는 가장 민감하게 반응하는 파장과, 자극을 인지하는 파장의 범위가 상이하다. 이로 인해 세 원추세포 모두 인식할 수 없는 장파에서 동일한 특성의 단파(정확히는, 망막이 해당 파장 이하를 받아들이지 못하기 때문에 원추세포에 아예 도달하지 않는다) 내의 파장을 모아 상술한 ‘가시광선’으로 정의할 수 있게 된 것이다.

20세기 초반에 진행된 색 자극 실험들을 통해 인간은 가시광선을 3개(원추 세포가 3개이므로, 최소 3개가 필요하다)의 단색광의 조합으로 만들어낼 수 있음을 알게 되었고, 이를 통해 CIE(Commission Internationale d’Eclairage)는 빛의 색상 측정을 진행하는 표준 실험으로 가시광선 영역 전체를 가장 효율적으로 덮을 수 있는 세 단일 파장(red - 645nm, green - 526nm, blue - 444nm)을 골라 임의의 단일 파장이 주어졌을 때 이 세 단일 파장의 강도를 [-1. 1] 범위 내에서 조절해 동일한 파장을 만들어내는 방법을 제안했다.

이 실험을 통해 스펙트럼 분포 상의 각 파장과 세 가지 단일 파장을 연결하는 함수를 얻어낼 수 있었고, 이를 색상 일치 함수(Color Matching Function)라 하며 아래의 그래프와 같다.

color matching function graph
임의의 SPD에 이 색상 일치 함수를 곱한 후 나타나는 각각($r$, $g$, $b$)의 결과 곡선을 적분함으로써 각 파장의 상대적인 강도를 얻어낼 수 있다.

그런데 여기서 문제점은, 파장의 강도가 음수가 될 수 있다는 점인데, 이는 물리적으로 불가능한 현상이기에 실제로 표현할 수 없다는 것이다(실제 CIE의 색도 측정 실험에서는 테스트 색상에 음수인 파장을 더해줌으로써, 즉 좌변에 값을 더함으로써 우회적으로 이를 표현할 수 있었다).
따라서 CIE는 실험에 사용된 세 가지 파장을 선형으로 조합하여 모든 파장에 대해 양수인 세 가지의 수학적으로 추상화된 가상 광원을 제안했고(물론 이 가상 광원도 여전히 unrealizable하다), 이들로 생성한 색상 일치 함수 $\lambda(x)$, $\lambda(y)$, $\lambda(z)$ 를 통해 다음 수식으로 $X$, $Y$, $Z$ 값을 얻어낼 수 있다. $$ X=\int_{380}^{780} \lambda(x)\lambda(s)d\lambda, Y=\int_{380}^{780} \lambda(y)\lambda(s)d\lambda,Z=\int_{380}^{780} \lambda(z)\lambda(s)d\lambda$$ CIE XYZ 라고 정의된 이 색상 일치 함수로 정의된 공간은 기존의 CIE rgb 기반 색 공간에 비해 기하적으로 훨씬 단순하게 표현 가능하므로 더 편리한 색상 표현 좌표계로서 기능할 수 있게 되었다. 이 떄 Y값은 휘도를 나타내는 변수이고, 휘도는 색도에 전혀 영향을 미치지 않으므로 Y값을 고정함으로써 색도만을 표현하는 평면을 얻을 수 있게 되고, 이를 위해 CIE는 $X + Y + Z = 1$인 평면에 이 공간을 투영(Projection)할 것을 제안했다.

해당 평면이 2차원이기도 하고, $X + Y + Z = 1$로 정의되었기 때문에 $Z$는 아무런 정보를 가지고 있지 않으므로 이 색도 평면을 $x$, $y$축으로 표현하면 앞서 잠시 무시한 휘도 $Y$와 함께 결론적으론 $xyY$좌표계의 형태의 색상을 정의할 수 있다.
참고로 위의 색도 평면에서 표현되는 말굽 모양의 색도 다이어그램 안에 삼각형(Gamut Triangle)이 존재하는데, 이는 임의의 색 공간이 해당 색도 다이어그램에서 어느 정도의 색들까지 표현할 수 있는지의 집합을 나타내는 것으로, sRGB, ACEScg, DCI-P3등 다양하며 위 이미지에 표현된 색 공간은 sRGB 라는 공간이다.
또한 색도 다이어그램도 여러 가지가 제안되었으며 CIELUB, CIELUV, CIE 8.9 UCS, ICC, Jab등등 다양하다.

중요한 점은, 각각의 색 공간이 서로 다른 범위의 색상을 표현할 수 있기 때문에 동일한 렌더링 연산을 수행한다 할 지라도 색 공간에 따라 서로 다른 결과가 나온다는 것이다. 간단한 예로, sRGB공간에서의 (0.5, 0.5, 0.5)값과 ACEScg에서의 (0.5, 0.5, 0.5)의 색상이 다른 것을 볼 수 있다. 그리고 보통 표현 가능한 범위와 연산의 정확도는 비례하는 경향이 있다. 즉, sRGB 공간에서의 색상 곱셈과 ACEScg 공간에서의 색상 곱셈 연산의 결과 중 ACEScg 공간에서의 결과가 더 물리적 작용의 결과에 가깝다.

지금까지 살펴본 XYZ공간은 정확한 색의 표현과 범위를 나타내기 위해 세 개의 가상 광원의 조합으로 정의된 공간이었다. 그러므로 XYZ공간의 기저(X, Y, Z)는 현실적으로 표현될 수 없기 때문에 이를 디스플레이가 표현 가능한 RGB값으로 옮겨야 실제 디스플레이 장치 등을 활용해 출력할 수 있다. 마찬가지로 디스플레이 장치들이 색을 표현하는 방법으로 해당 장치의 R, G, B 원색(Primary)의 파장을 출력하는 세 개의 서브픽셀을 사용해 디스플레이 RGB공간(상술했던 CIE rgb와 다르다)에서 표현된 색의 각 가중치만큼의 강도로 서브픽셀의 출력 강도를 조절함으로써 색상을 만들어낸다.

그런데 이처럼 세 가지 단일 파장의 가산 혼합으로 색을 표현하는 방식은 인간의 인지적인 양(Quantity)을 기준으로 하는 것이기에 물리적으로 엄밀하지 않다. 따라서 물리 기반 렌더링(PBR)에서 RGB값을 이용한 연산을 수행하는 것은 기술적으로 적절하지 않다.
정말 ‘물리 기반’ 렌더링을 수행하려면 빛의 상호작용이 일어날 때 그들 간의 SPD를 곱하고 이를 ‘적분’해야 한다. 단순히 R, G, B 세 개의 값으로 빛의 상호작용을 표현하게 되면 서로 다른 SPD가 동일한 RGB로 매핑되는 ‘메타머(metamers)‘라 부르는 현상이 나타날 수 있고, 각 디스플레이마다 R, G, B의 기준 파장이 다르기에 한 디스플레이에서 메타머 관계인 두 SPD가 다른 디스플레이에서는 서로 다른 RGB값으로 표현되는 등의 예측 불가능한 상황들이 발생한다.
따라서 정확하게 색도를 표현해야 하는, 즉 예측 가능한 렌더링 결과가 항상 출력되어야 하는 렌더링 환경에서는 RGB공간을 기반으로 색을 연산하면 안 되며, XYZ 공간에서 연산을 수행한 후 출력 직전에 RGB값으로 변환해 출력해야 한다.

그러나 게임 등의 실시간 렌더링 어플리케이션에서는 이 정도의 ‘미묘한’ 색 오차가 품질에 많은 영향을 미치지 않을 뿐더러, 정확한 색을 표현하기 위해 사용되는 복잡한 계산으로부터의 성능 오버헤드가 더 큰 문제로 여겨지기에 RGB값을 기반으로 하는 선형 RGB 공간에서 바로 렌더링 연산을 수행한다.

Scene to Screen #

HDR(High Dynamic Range) Display Encoding #

지금까지 빛과 색을 측정하고 표현하는 방법, 그리고 그 기준들에 대해 살펴보았으며 다양한 색 공간들과 함께 디스플레이 RGB 공간에 대해 알아보았다. 모든 렌더링 결과는 어떠한 공간에서 연산되었든 간에 결국 출력을 위해 RGB공간으로 변환되어야 하며, 일반적인 디스플레이 장치(모니터)들은 sRGB 색공간을 표준으로 삼아(정확히는 모니터만. TV의 경우에는 Rec.709Rec.1886 공간을 표준으로 삼는데, 이들과 sRGB는 동일한 RGB영역 및 D65(White Point)를 가지고 있고 거의 유사한 디스플레이 인코딩 곡선을 가진다) 사용하는데 이 장치들을 SDR(Standard Dynamic Range) 디스플레이 라고 부른다.

반면 HDR 디스플레이 장치들은 Rec.2020 혹은 Rec.2100 색공간을 표준으로 사용하는데, 이들은 sRGB와 동일한 D65를 가지지만 표현 가능한 색 영역이 훨씬 넓다.
-TBA-

Tone Mapping #

Exposure #

Color Grading #