콘텐츠로 이동

색과 HDR

alpha2는 명확히 정의된 하나의 색 공간에서 렌더링하고 SDR로 export합니다. 이 페이지에서는 소스 종류별로 그 공간에 들어오는 방식, 엔진이 HDR 비디오를 다루는 방식, 블렌딩과 그라디언트의 동작을 설명합니다. 다 읽고 나면 export에서 어떤 색이 나올지 알 수 있고, 색 태그가 잘못된 소스를 바로잡을 수 있습니다.

엔진은 디스플레이 기준(display-referred)의 **BT.709 원색 선형 광(linear light)**에서 합성하며, 1.0이 SDR 화이트(100니트)입니다. 합성은 항상 premultiplied로 합니다.

모든 export는 SDR BT.709입니다. 브라우저에서는 export 프레임이 BT.709, limited range의 planar I420으로 돌아옵니다. 네이티브에서는 alpha2-host가 선택한 코덱으로 인코딩하며, bitDepth: 10으로 10비트 그림을 요청할 수 있습니다.

소스 읽는 방식
SDR 비디오 sRGB EOTF로 디코딩합니다. 광색역 원색은 BT.709로 변환합니다.
정지 이미지 항상 sRGB 코드 값으로 읽습니다.
HDR 비디오(PQ 또는 HLG) settings.color에 따라, 선형화하고 BT.709로 변환한 뒤 SDR로 톤 매핑하거나, 거부합니다.
OpenEXR(확장 소스) 파일의 원색, 또는 소스가 지정한 primaries(bt709, bt2020, p3_d65, aces_ap0, aces_ap1)의 선형 광 RGB입니다.
문서 안의 색(채우기, 텍스트, 레이아웃) straight(premultiplied가 아닌) sRGB. 0..1 범위의 { red, green, blue, alpha } 또는 CSS hex로 씁니다.

브라우저에서 uploadRgbaImage는 premultiplied sRGB RGBA8 픽셀을 받고, uploadYuvFrame은 프로젝트의 색 파이프라인(톤 매핑을 제어)으로 planar YUV를 변환하며, alpha2/hdr-frames는 planar와 HDR VideoFrame을 업로드합니다.

HDR 소스를 어떻게 다룰지는 settings.color가 정합니다.

{
"width": 1920,
"height": 1080,
"frame_rate": { "num": 30, "den": 1 },
"sample_rate": 48000,
"color": { "hdr": "tone_map", "hdr_peak_nits": 1000 },
"blend_space": "linear_light"
}
  • hdr: tone_map(기본값)은 HDR 소스를 SDR 작업 공간으로 가져옵니다. reject는 렌더링을 거부합니다.
  • hdr_peak_nits: HDR 소스의 최대 휘도로 간주하는 값입니다. 기본값은 1000이고 100부터 10,000까지 지정할 수 있습니다. PQ는 이 값을 넘는 부분이 잘리고, HLG는 이 휘도로 표시되며, 톤 매핑은 이 값을 SDR 화이트로 가져옵니다.

톤 매핑은 ITU-R BT.2390 EETF이며, 색상(hue)을 유지하도록 각 픽셀의 가장 큰 성분에 적용합니다.

hdr이 reject이면 린터가 각 HDR 소스를 hdr_source로 알려 주므로, export가 실패하기 전에 미리 알 수 있습니다.

비디오의 색 정보는 보통 스트림과 프레임의 태그에서 옵니다. 태그가 없거나 잘못되었다면 소스에 color_metadata를 지정하세요. 이 값은 모든 호스트에서 프레임과 스트림의 태그를 덮어쓰므로, 모든 대상 환경이 소스를 같은 방식으로 읽습니다.

{
"id": "drone",
"kind": "video",
"locator": "file:///media/drone-hlg.mov",
"color_metadata": {
"primaries": "bt2020",
"transfer": "hlg",
"matrix": "bt2020_ncl",
"range": "limited",
"dynamic_range": "hdr"
}
}
필드 값
primaries bt601, bt709, bt2020
transfer bt709, srgb, pq, hlg
matrix bt601, bt709, bt2020_ncl, rgb(이미 RGB)
range limited, full
dynamic_range sdr 또는 hdr. transfer가 pq나 hlg일 때만 정확히 hdr

정지 이미지는 이 값을 무시합니다. 정지 이미지는 항상 sRGB로 읽습니다.

settings.blend_space는 블렌드 모드를 계산하는 공간을 고릅니다.

  • linear_light(기본값): 물리적으로 의미 있는 블렌딩.
  • srgb_encoded: 디자인 도구와 CSS처럼 sRGB로 인코딩된 값에서 블렌딩합니다. overlay나 soft-light 같은 대비 모드는 이 공간에서만 디자인 도구와 일치합니다.

그라디언트는 premultiplied 정지점을 선형 광에서 보간하므로, 두 색 사이의 그라디언트는 두 색의 물리적 혼합을 지나갑니다. 이펙트의 color 파라미터는 색 선택기에 보이는 그대로의 straight(premultiplied가 아닌) sRGB RGBA입니다.