스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
iOS의 EDR 살펴보기
EDR은 Apple의 HDR(High Dynamic Range) 표현 및 렌더링 파이프라인입니다. 앱에서 EDR을 사용하여 HDR 콘텐츠를 렌더링하고, iPhone 및 iPad에서 HDR 디스플레이의 다이내믹 레인지 기능을 활용하는 방법을 알아보세요. iOS에서 네이티브 EDR API를 활용하는 방법을 보여드리고, HDR이 적절한 경우를 결정하는 데 도움이 될 모범 사례를 제공하며, 톤 매핑 및 HDR 콘텐츠 렌더링을 위한 팁을 소개합니다. 또한 참조 모드를 소개하고 이를 통해 참조 응답을 제공함으로써 색상 등급 지정, 편집 및 콘텐츠 검토와 같이 색상이 중요한 작업 흐름을 활성화하는 방법을 중점적으로 다룹니다.
리소스
관련 비디오
WWDC23
Tech Talks
WWDC22
-
다운로드
♪ 부드러운 힙합 음악 ♪ ♪ 안녕하세요, Denis예요 여기 애플의 디스플레이와 색 기술 팀에서 일하고 있죠 오늘은 EDR에 대한 흥미로운 업데이트와 이 업데이트가 iOS 개발자에게 미치는 영향에 대해 알아볼게요 작년 영상을 보신 분들은 EDR에 익숙하실지도 모르지만 짧게 설명해 드릴게요 EDR은 확장된 동적 범위를 말하죠 바로 애플의 HDR 기술입니다 EDR은 렌더링 기술과 픽셀 표현을 동시에 가리키는데요 EDR의 픽셀 표현은 특히 중요합니다 표준 및 고 명암비 콘텐츠를 일관되게 표현하기 때문이죠 노출이 잘된 콘텐츠를 보시죠 여기서 피사체인 캠핑하는 사람들은 이미지의 표준 동적 범위 사이에 있습니다 반면 캠프파이어처럼 방사적인 하이라이트는 동적 범위가 더 높은 곳에 있습니다 표준 범위의 표현에서 이런 요소는 잘려 나가지만 EDR 덕분에 표현될 수 있죠 다른 픽셀 표현은 고정된 범위의 밝기 값을 나타내도록 설계됐지만 EDR의 표현은 실제로 동적이에요 임의의 값을 전부 표현할 수 있죠 또 EDR은 사용되지 않은 역광을 이용해 디스플레이의 피크에 관계 없이 모든 디스플레이가 높은 동적 범위 콘텐츠를 렌더링하게 해 줍니다 HDR 콘텐츠가 더 널리 보급되고 접근 가능해지면서 macOS의 앱에서도 EDR을 채택하는 경우가 많아졌죠 '발더스 게이트 3' '디비니티: 오리지널 신 2' '쉐도우 오브 더 툼 레이더'는 macOS에서 EDR을 채택합니다 EDR을 채택하면 게임은 더 밝고 포화된 색상을 렌더링할 수 있고 더 사실적인 조명과 반사를 표현하며 더 다채로운 콘텐츠를 생성할 수 있습니다 SDR에서는 최대치를 넘어 흰색으로 나오는 밝은 요소도 EDR에서는 작가가 의도했던 색의 밝기나 심도를 다시 얻게 되죠 EDR은 Safari와 QuickTime player를 포함한 Apple 생태계 전반에 통합됩니다 결과적으로 Apple TV나 넷플릭스 같은 주문형 비디오 앱과 서비스는 지속적으로 확장되는 HDR10과 돌비 비전, ProRes 콘텐츠 카탈로그를 소비자에게 제공할 수 있게 되죠 EDR을 적용한 전문용 앱들은 사용자가 놀라운 HDR 콘텐츠를 만들 수 있게 하죠 HDR 사진과 영상의 정확한 편집 및 그레이딩 마스터링, 검토 같은 다양한 전문 작업 과정을 지원해요 macOS의 EDR 적용에 기대가 큰데요 EDR에 몇 가지 업데이트도 하게 됐습니다 무엇보다도 EDR API를 이제 iOS와 iPadOS에서 사용할 수 있게 됐어요 게다가 Apple은 프로 사용자를 지원하기 위해 올해 Liquid Retina XDR 디스플레이를 탑재한 12.9인치 iPad Pro에 두 가지 새로운 색상 기능을 선보일 예정입니다 참조 모드와 Sidecar를 통한 EDR 렌더링이죠 참조 모드는 색상 그레이딩, 편집, 검토처럼 색상에 민감한 워크플로에서 사용하도록 설계된 새로운 디스플레이 모드입니다 macOS의 유사한 참조 사전 설정과 다양한 공통 영상 형식을 참고해 응답을 제공하는 모드죠 이 기능을 위해 참조 모드는 SDR의 최고 밝기를 100니트 HDR의 최고 밝기를 1,000니트로 고정하여 EDR 헤드룸을 10배로 넓혔습니다 또 참조 모드는 디스플레이 매핑을 위한 일대일 미디어를 제공합니다 그리고 True Tone과 자동 밝기 조정, Night Shift 같은 주변 환경에 관한 모든 동적 디스플레이 조정을 비활성화하는 대신 사용자가 수동으로 화이트 포인트를 미세하게 보정할 수 있죠 이런 식으로 디스플레이는 각각의 사양이 전달하는 대로 정확하게 색상을 생성합니다 이 차트는 참조 모드에서 지원하는 형식 목록입니다 macOS의 참조 사전 설정과 달리 참조 모드는 단일 토글로 가장 일반적인 5가지 HDR, SDR 영상 형식을 지원하며 미디어 유형 간에 일관된 참조 응답을 제공합니다 이 목록에 없는 형식의 콘텐츠가 있더라도 걱정하지 마세요 지원하지 않는 형식은 기본 디스플레이 모드와 같이 색상이 보여집니다 예를 들어 참조 모드에서의 LumaFusion을 살펴보죠 iOS에서 참조 모드를 활성화하면서 LumaFusion은 촬영 후 편집에 더 강력한 도구가 됐습니다 HDR 영상을 표시할 때 P3 색 영역 내에서 최대 1,000니트까지 색상이 정확하게 렌더링돼서 사용자는 영상이 항상 정확하고 일관되게 보인다고 확신할 수 있죠 참조 모드와 LumaFusion의 새로운 비디오 스코프 기능을 결합해 이제 iPad Pro에서 색상에 민감한 워크플로가 가능합니다 참조 모드를 비활성화하면 EDR 헤드룸이 동적으로 변할 수 있죠 여기서 iOS가 영상의 밝기를 조절하면서 우리 눈으로 확인할 수 있습니다 LumaFusion 프로젝트는 XML로 내보낼 수 있는데 XML 형태는 Mac의 다른 인기 편집 앱에서 불러올 수 있으므로 콘텐츠 제작자 팀이 두 플랫폼에서 쉽게 협업할 수 있죠 LumaFusion이 참조 모드를 채택한 건 정말 흥미롭습니다 전문 콘텐츠 제작자에게 가치와 유연성도 제공할 수 있고요 하지만 참조 모드 말고도 새 기능은 더 있습니다 2019년에는 Sidecar를 소개했습니다 Mac 사용자가 iPad를 보조 디스플레이로 사용할 수 있게 하는 기술이죠 이제 참조 모드의 도입으로 Sidecar를 통한 EDR 렌더링 지원이 추가됐습니다 참조 모드를 활성화하면 Sidecar의 기능이 확장되는데요 SDR, HDR 콘텐츠를 참조 등급으로 지원하기 때문에 Apple Silicon Mac용 보조 참조 디스플레이로 iPad Pro를 사용할 수 있습니다 물론 Sidecar를 통해서 렌더링된 콘텐츠는 참조 모드의 기존 iOS와 동일한 모든 영상 형식에 대해 참조 응답을 제공받을 수 있습니다 예를 들어 HDR 영상 사전 설정으로 Mac에서 렌더링된 HDR10 테스트 패턴을 살펴보고 Sidecar를 통해 표시된 iPad Pro의 렌더링과 비교해 보겠습니다 이 구성에서 두 장치는 모두 P3 색 영역과 D65 화이트 포인트 기준 디스플레이로 작동합니다 두 디스플레이의 사양이기 때문이죠 P3 기본 색 막대와 보조 색 막대에서 알 수 있듯이 Mac과 iPad 모두 우리가 예상한 것과 유사한 응답을 보입니다 또 양쪽의 구성 모두 최대 휘도를 1,000니트까지 지원하는데 그라데이션에서 볼 수 있듯이 이런 값은 충실히 렌더링되어 1,000니트 이상의 값은 잘려 나갑니다 우리는 Sidecar를 통한 EDR 렌더링이 전문 사용자에게 새로운 기회를 가져다줄 생각에 들뜨네요 또 더 많은 개발자가 앱에 EDR을 채택하여 이런 기능을 활용할 수 있길 기대합니다 그런 점에서 EDR 렌더링을 여러분의 iOS와 iPadOS 앱에 통합하는 법을 알아보죠 일단 EDR의 픽셀 표현과 렌더 파이프라인의 의미를 알아보겠습니다 SDR의 부동 소수점 표현은 원래 0부터 1까지였죠 0은 검은색 1은 SDR 흰색입니다 EDR에서 SDR 콘텐츠는 여전히 0에서 1 안에 표현되지만 1보다 큰 값은 SDR보다 밝은 콘텐츠를 나타냅니다 EDR은 선형 공간임을 기억해 두세요 즉 2.0 EDR은 우리 눈에 1.0보다 2배로 밝은 게 아닙니다 다른 HDR 형식과 달리 EDR은 0에서 1 범위로 값을 매핑하지 않고 이 사실은 렌더링까지 영향을 미칩니다 이런 점에서 EDR은 SDR 콘텐츠나 0부터 1 사이 값은 항상 렌더링이 되도록 보장하죠 1 이상의 값은 EDR 헤드룸 범위까지는 톤 매핑 없이 적절하게 렌더링됩니다 하지만 그보다 밝은 값은 잘립니다 처음에는 이런 행동이 이상적이지 않게 보이겠지만 HDR로 만들어진 모든 콘텐츠는 가능한 한 의도에 가깝게 렌더링된다는 뜻입니다 일반적인 표현처럼 너무 밝게 나온 하이라이트는 잘린 채로 표시되죠 분명 헤드룸이 높을수록 콘텐츠는 더 밝고 역동적일 수 있습니다 하지만 헤드룸이 얼마나 되는 걸까요? 순간의 EDR 헤드룸은 동적인 값이며 현재 디스플레이 밝기는 물론 장치의 특정 디스플레이 기술을 포함하지만 여기에 국한되지 않는 많은 요소에 기반한다는 점을 유의하세요 하지만 과하게 단순화해서 말하자면 현재 EDR 헤드룸은 디스플레이의 최대 밝기를 현재 SDR 밝기로 나눈 값과 거의 같습니다 그래서 아까 제가 참조 모드가 EDR 헤드룸이 10배라고 한 건 EDR 1.0, 즉 SDR 최대 밝기를 100니트로 고정했고 HDR의 최대 밝기를 1,000니트로 고정했기 때문이죠 그래서 1,000니트를 100니트로 나눠 10배로 일정한 EDR 헤드룸이 제공되는 겁니다 이 표에는 다양한 장치와 최대 잠재 헤드룸의 예가 몇 가지 더 있습니다 이건 잠재적인 헤드룸이고 실제 헤드룸은 현재 디스플레이 밝기를 포함해 다양한 다른 요인에 좌우된다는 점을 유의하세요 영상 후반부에 헤드룸에 대해 더 자세히 살펴보고 헤드룸을 쿼리하고 사용해서 EDR 렌더링에 관해 정보에 입각한 결정을 내리는 예시를 보여 드리죠 하지만 일단은 EDR에 대해 잘 이해하고 언제 필요한지를 아셔야 합니다 이제 EDR 콘텐츠를 실제로 렌더링해 봅시다 이 섹션에서는 HDR 콘텐츠를 렌더링 가능한 형식으로 읽는 방법을 설명합니다 여기서는 이미지 I/O 워크플로를 예로 들지만 다른 프레임워크를 찾는다면 올해 다른 EDR 영상을 찾아보세요 정지 매체의 경우 로드하려는 이미지 파일로 시작할 겁니다 보통 이중 평면 YUV 공간에서 이미지가 인코딩되죠 처음에 로드하면 이미지와 버퍼가 원래 형식으로 표시됩니다 안타깝지만 이런 형식에서는 이미지를 의미 있는 방식으로 해석하고 작업하는 게 어려울 수 있죠 그래서 CGBitmapContext의 도움을 받아 이미지를 디코딩하고 좀 더 사용 가능한 형식으로 변환할 겁니다 이때 컨텍스트의 백업 픽셀 데이터에서 MTL 텍스처를 생성한 다음 Metal 엔진으로 렌더링할 수 있습니다 더 구체적으로 말하면 이 과정에는 우리가 총 4단계를 다뤄야 합니다 먼저 우리의 HDR 스틸을 위한 CG 이미지를 만들고 CG 이미지를 비트맵 컨텍스트로 가져와서 Metal 텍스처를 만듭니다 마지막으로 비트맵 데이터를 새로 만든 텍스처에 로드하죠 첫 단계에서는 이미지를 읽고 약간의 설정을 합니다 먼저 CGImageSource에서 URL의 이미지를 읽고 해당 소스에서 CGImage를 생성합니다 이 경우 딕셔너리의 옵션 없이 이미지를 만들었습니다 하지만 특정 HDR 형식의 부동 소수점 버퍼를 원한다면 새로운 옵션인 kCGImageSourceShouldAllowFloat 옵션을 설정하면 됩니다 CGBitmapInfo를 인스턴스화해 보죠 여기서는 사전 곱셈된 알파로 16비트 부동 소수점 컨텍스트를 만듭니다 Metal 텍스처가 동일 형식을 사용하길 원하기 때문에 이 점을 기억하세요 다음은 CGBitmapContext를 구성합니다 방금 만든 비트맵 정보와 CGImage의 너비 및 높이를 사용하세요 렌더링할 CAMetalLayer의 색 공간과 컨텍스트의 색 공간이 일치해야 한다는 거 잊지 마세요 아니면 적절한 색상 관리를 직접 수행해야 하니까요 마지막으로 CGImage를 비트맵 컨텍스트에 가져옵니다 이 시점에 컨텍스트에서 Metal 텍스처를 만드는 것으로 넘어갑니다 Metal 텍스처를 만들기 위해 먼저 MTLTextureDescriptor를 인스턴스화합니다 비트맵 컨텍스트를 위해서 우리가 절반인 부동 소수점을 쓰기로 한 걸 기억하세요 하지만 EDR을 렌더링할 땐 10비트 파란색, 녹색, 빨간색 2비트 알파와 함께 2D 텍스처를 32비트 픽셀 형식으로 만들 수도 있습니다 다음 섹션에서 더 자세히 설명하겠지만 일단은 텍스처의 픽셀 형식이 콘텐츠의 픽셀 형식과 일치해야 하는 것만 알고 가죠 우리 경우는 부동 소수점의 절반입니다 이제 Metal 레이어의 장치와 새로 만든 텍스처 기술자로 텍스처를 인스턴스화할 겁니다 끝으로 비트맵 컨텍스트에서 데이터를 가져와 텍스처에 복사합니다 이 과정을 통해 EDR 값이 포함된 Metal 텍스처가 생깁니다 Metal 파이프라인으로 보내 렌더링할 수 있겠죠 이 섹션에서는 워크플로의 예시를 다룹니다 URL에서 시작해 Metal 텍스처로 이어지는 HDR 스틸 이미지를 소싱하기 위한 워크플로의 예를 다루겠습니다 다음으로 iOS와 iPadOS에서 이런 질감을 렌더링하는 데 필요한 최소한의 코드 변경 사항을 알아보죠 새 iOS와 iPadOS API에 EDR을 채택하는 과정은 macOS에 적용할 때와 똑같습니다 macOS 빌드에 대한 EDR 지원이 이미 앱에 있다면 변경할 필요가 없습니다 EDR을 적용하려면 CAMetalLayer를 사용하는지 그 레이어에 적절한 플래그와 태그를 설정했는지 EDR 형식의 밝은 콘텐츠를 가지고 있는지 확인해야 합니다 먼저 콘텐츠를 렌더링할 CAMetalLayer를 선택하세요 이 레이어에서 활성화해야 하는 건 wantsExtendedDynamicRange Content 플래그입니다 그다음 같은 레이어에서 지원되는 픽셀 형식의 조합과 CGColorSpace를 설정해야 합니다 갖고 있는 콘텐츠의 종류와 소싱하는 방법에 따라 특정 픽셀 형식과 색 공간이 달라집니다 이 경우 이미지를 16비트 부동 소수점 버퍼에 로드했습니다 그리고 여기서는 확장된 선형 디스플레이의 P3 색 영역과 일치하도록 했죠 iOS는 선형 색 영역과 조합한 16비트 부동 소수점 픽셀 버퍼에서 EDR 렌더링을 지원합니다 하지만 이런 조합 중 하나를 사용하기로 했다면 색 영역의 확장된 변형을 사용해야 합니다 아니면 콘텐츠가 SDR에 잘리게 되죠 iOS는 앞서 잠깐 언급한 10비트 패킹 BGRA 픽셀 버퍼도 지원합니다 이런 버퍼는 차트에 나온 대로 PQ나 HLG 색 영역을 사용해 렌더링할 수 있습니다 이 섹션에선 EDR 렌더링을 지원하기 위해 렌더링 레이어에 필요한 최소한의 코드 변경 사항을 설명했습니다 wantsExtendedDynamicRangeContent 플래그뿐 아니라 로EDR을 지원하는 다양한 픽셀 형식과 색영역도 알아봤죠 Metal 텍스처를 렌더링할 경우에 이전 섹션에서는 CAMetalLayer로 소스를 제공하고 EDR 렌더링을 했습니다 하지만 방법이 몇 가지 더 있습니다 처음 개요에서 언급했듯이 EDR의 기본 동작은 현재 EDR 헤드룸에서 잘라 내는 겁니다 EDR 콘텐츠 렌더링을 정당화할 만큼 헤드룸이 높지 않다고 판단하고 대신 SDR 경로를 따를 수도 있습니다 혹은 현재 헤드룸을 사용해 콘텐츠를 표시하기 전에 톤 매핑을 하는 경우도 있죠 어느 쪽이든 iOS는 이제 헤드룸 쿼리를 지원하는 새로운 API가 있습니다 이번 섹션에서는 이런 결정을 짚어 보고 macOS와 얼마나 다른지 알아보겠습니다 결정에 도움이 될 겁니다 macOS에서 헤드룸 쿼리는 NSScreen에서 찾을 수 있습니다 NSScreen에는 디스플레이가 지원할 수 있는 최대 EDR 헤드룸 현재 참조 사전 설정의 최대 EDR 헤드룸과 현재 EDR 헤드룸에 관한 쿼리가 있습니다 또 macOS는 EDR 헤드룸이 변경될 때마다 알림을 제공합니다 하지만 iOS에서 헤드룸 쿼리는 UIScreen에 있습니다 NSScreen과 달리 디스플레이가 지원하는 최대 EDR 헤드룸과 현재 EDR 헤드룸에 대한 쿼리가 있죠 또 UIScreen은 기준 디스플레이 모드 상태를 제공하며 참조 모드가 지원되고 활성화되는지 여부를 보여 주는 데 사용됩니다 UIScreen은 EDR 헤드룸의 변경 알림을 제공하지 않지만 참조 모드 상태가 변경될 때마다 알림을 보냅니다 최대 참조 헤드룸 쿼리가 목록에서 빠진 걸 혹시 알아채셨나요? 전용 쿼리를 쓰는 대신 참조 모드 상태가 활성화되었음을 나타낼 때 최대 잠재 헤드룸을 쿼리하여 값을 결정할 수 있습니다 샘플 코드를 보고 어떻게 헤드룸을 쿼리하는지 감을 잡아 볼까요? UIScreen에서는 디스플레이에서 가능한 최대 헤드룸을 보기 위해 EDR 잠재 헤드룸을 쿼리할 수 있습니다 이 값이 너무 낮으면 대신 SDR 경로를 선택해 렌더링해서 처리 능력을 절약할 수 있죠 EDR 경로를 결정한 후 렌더 대리자를 얻거나 정기적으로 예정된 그리기 호출을 받을 수 있습니다 이 호출에서 우리는 현재 EDR 헤드룸을 쿼리해 헤드룸을 초과해서 잘리지 않도록 콘텐츠를 톤 매핑하는 데 사용할 수 있습니다 참조 모드 상태를 확인하려면 상태가 변경될 때마다 알림을 받도록 등록할 수 있죠 referenceDisplayModeStatus DidChangeNotification를 씁니다 그러면 상태가 바뀔 때마다 새 상태와 잠재 EDR 헤드룸을 보고 렌더링에 대한 추가 결정을 내리는 데 사용할 수 있습니다 참조 모드 상태와 관련해 네 가지 고유한 상태를 알아 둬야 합니다 StatusEnabled는 참조 모드가 활성화되고 예상대로 렌더링 중임을 나타내죠 StatusLimited는 참조 모드가 활성화됐지만 모종의 이유로 일시적으로 참조 응답을 얻을 수 없음을 나타냅니다 이 상태가 발생하면 참조 응답에 문제가 있단 걸 사용자에게 알리기 위해 참조 없음 UI 알림이 함께 표시됩니다 StatusNotEnabled는 참조 모드가 이 장치에서 지원되지만 활성화되지 않았음을 나타냅니다 마지막으로 StatusNotSupported는 참조 모드가 이 장치에서 지원되지 않음을 나타냅니다 이런 새 API는 개발자에게 디스플레이의 현재 상태에 대해 더 깊은 통찰력을 제공하고 EDR 콘텐츠를 어떻게 렌더링할지 정보에 입각한 결정을 내리는 데 필요한 도구를 제공하죠 이전 섹션에서는 현재 EDR 헤드룸을 포함해 다양한 헤드룸 매개 변수를 쿼리하는 법을 설명했습니다 이걸 잘리는 걸 피하면서 톤 매핑 하는 데도 쓸 수 있죠 하지만 여러분이 굳이 톤 매핑 알고리즘을 파고들거나 구현하고 싶지 않다면 어떨까요? 영상 콘텐츠의 경우 Apple의 내장된 톤 매핑을 이용하고 싶을 수도 있죠 여러분의 콘텐츠에서 Apple의 톤 매핑을 활성화하려면 HDR10과 HLG에 대한 메타데이터 생성자를 포함하는 CAEDR 메타데이터 인터페이스를 사용하면 됩니다 톤 매핑이 모든 플랫폼에서 지원되는 건 아니니 조심하세요 하지만 지원되는 플랫폼인지 확인할 수 있는 쿼리가 있습니다 플랫폼이 톤 매핑을 지원하는지 확인하려면 CAEDRMetadata.isAvailable을 쿼리하세요 가능하다면 CAEDRMetadata를 인스턴스화해야 합니다 특정 생성자에 대해 잠시 후에 살펴보겠지만 일단은 건너뛰겠습니다 EDR 메타데이터가 있으면 렌더링하는 레이어에 적용합니다 제공된 메타데이터를 기반으로 시스템 톤 매퍼가 레이어를 처리하게 선택할 수 있습니다 아까 언급한 것처럼 HDR 영상 포맷에 특화된 EDR 메타데이터 생성자가 여럿 존재합니다 여기 매개 변수를 사용하지 않는 HLG 메타데이터의 생성자가 있습니다 다음은 사용 가능한 두 개의 HDR10 생성자 중 하나입니다 이 생성자는 매개 변수가 세 가지 있습니다 마스터링 디스플레이의 최소 휘도를 니트로 표현한 것 마스터링 디스플레이의 최대 휘도를 니트로 표현한 것 EDR 1.0의 밝기에 대한 콘텐츠 매핑을 니트로 나타낸 광출력 척도 일반적으로 이 값은 100으로 설정합니다 마지막으로 두 번째 HDR10 생성자가 있습니다 마스터링 디스플레이의 색 영역 SEI 메시지와 콘텐츠의 광수준 정보 SEI 메시지 그리고 광출력 척도가 매개 변수로 있죠 아까 말했듯이 일반적으로 100니트입니다 이런 생성자 중 하나를 사용해 CAEDRMetadata 개체를 만들면 앱의 CAMetalLayer에 개체를 설정하세요 이러면 이 레이어에서 렌더링된 모든 콘텐츠가 시스템 톤 매퍼에 의해 처리되기 때문에 직접 매핑을 수행하지 않고도 잘려 나가는 걸 방지할 수 있습니다 어떤 생성자를 사용하느냐는 전적으로 콘텐츠의 소스와 작성 방식에 따라 다르지만 일반적으로 콘텐츠가 HLG 색 영역에 있으면 HLG 생성자를 사용하게 될 겁니다 만약 PQ 색 영역에 있으면 HDR10 생성자를 사용하게 되겠죠 콘텐츠에 SEI 메시지가 이미 첨부된 경우 작성자의 의도를 잘 따를 수 있게 두 번째 HDR10 생성자를 사용하는 게 좋습니다 아니면 첫 번째 생성자를 사용해야 합니다 선형 색 공간을 사용하는 경우 어떤 생성자를 사용하느냐는 콘텐츠의 작성 방식에 따라 완전히 달라집니다 Apple의 톤 매핑과 함께 사용하려 한다면 HDR10과 HLG 메타데이터에 관한 개발자 문서를 강력히 추천합니다 이제 Pixelmator와 EDR 채택에 대해 알아보겠습니다 우린 EDR 덕분에 이미지를 더 생생하고 사실적인 방식으로 렌더링할 수 있죠 예를 들어 RAW 사진을 열고 노출 및 하이라이트를 늘리면 가장 밝은 영역의 세부 사항은 표준 동적 범위, 즉 SDR로 렌더링할 수 없습니다 이제 EDR을 켜면 SDR 흰색 너머의 세부 사항이 표시됩니다 캔버스의 EDR 콘텐츠가 SDR 색상과 비교해 얼마나 더 선명하게 표시되는지 확인해 보세요 EDR을 끄면 SDR과 EDR의 시각적 차이가 훨씬 명확해집니다 이제 세션은 끝났습니다 이 강연에서 우리는 iOS와 iPadOS에서 제공되는 새롭고 흥미로운 기능 몇 가지를 다뤘죠 EDR에 대해서 빠르게 설명하고 이미지 I/O로 HDR 이미지를 읽고 Metal 텍스처로 변환하는 워크플로를 살펴보고 SDR로 잘라 내지 않고도 텍스처를 렌더링할 수 있게 EDR을 선택하는 법을 알아봤습니다 또 헤드룸 쿼리 API를 간략하게 다루고 EDR 렌더링에서 정보에 입각한 결정을 할 때 어떻게 유용한지 알아봤죠 또 인기 있는 HDR 형식의 톤 매핑을 제공하는 Apple의 시스템 톤 매핑을 선택하는 법도 알아봤습니다 이 영상을 통해 EDR을 더 잘 이해하고 여러분의 iOS와 iPadOS 앱에 적용하는 방법을 배우셨기를 바랍니다 HDR 또는 EDR 콘텐츠에 대한 전반적인 작업을 알고 싶다면 과거의 몇 가지 세션이 있습니다 곧 있을 세션도 추천할게요 그 세션의 이름으로 인사하도록 하겠습니다 'iOS의 EDR 살펴보기’였습니다 WWDC를 즐기세요 ♪
-
-
9:23 - Create CGImage and Draw
// Create CGImage from HDR Image let isr = CGImageSourceCreateWithURL(HDRImageURL, nil) let img = CGImageSourceCreateImageAtIndex(isr, 0, nil) // Draw into floating point bitmap context let width = img.width let height = img.height let info = CGBitmapInfo(rawValue: kCGBitmapByteOrder16Host |CGImageAlphaInfo.premultipliedLast.rawValue | CGBitmapInfo.floatComponents.rawValue) let ctx = CGContext(data: nil, width: width, height: height, bitsPerComponent: 16, bytesPerRow: 0, space: layer.colorspace, bitmapInfo: info.rawValue) ctx?.draw(in: img, image: CGRect(x: 0, y: 0, width: CGFloat(width), height: CGFloat(height)))
-
10:30 - Create floating point texture and Load EDR bitmap
// Create floating point texture let desc = MTLTextureDescriptor() desc.pixelFormat = .rgba16Float desc.textureType = .type2D let texture = layer.device.makeTexture(descriptor: desc) // Load EDR bitmap into texture let data = ctx.data texture.replace(region: MTLRegionMake2D(0, 0, width, height), mipmapLevel: 0, withBytes: &data, bytesPerRow: ctx.bytesPerRow)
-
11:55 - CAMetalLayer properties
// Opt into using EDR var layer = CAMetalLayer() layer?.wantsExtendedDynamicRangeContent = true // Use supported pixel format and color spaces layer.pixelFormat = MTLPixelFormatRGBA16Float layer.colorspace = CGColorSpace(name: kCGColorSpaceExtendedLinearDisplayP3)
-
14:42 - UIScreen headroom
// Query potential headroom let screen = windowScene.screen let maxPotentialEDR = screen.potentialEDRHeadroom if (maxPotentialEDR < 1.5) { // SDR path } // Query current headroom func draw(_ rect: CGRect) { let maxEDR = screen.currentEDRHeadroom // Tone-map to maxEDR } // Register for Reference Mode notifications let notification = NotificationCenter.default notification.addObserver(self, selector: #selector(screenChangedEvent(_:)), name: UIScreen.referenceDisplayModeStatusDidChangeNotification, object: nil) // Query for latest status and headroom func screenChangedEvent(_ notification: Notification?) { let status = screen.referenceDisplayModeStatus let maxPotentialEDR = screen.potentialEDRHeadroom }
-
16:54 - CAEDRMetadata and CAMetalLayer
// Check if EDR metadata is available let isAvailable = CAEDRMetadata.isAvailable // Instantiate EDR metadata // ... // Apply EDR metadata to layer let layer: CAMetalLayer? = nil layer?.edrMetadata = metadata
-
17:22 - Instantiating CAEDRMetadata
// HLG let edrMetadata = CAEDRMetadata.hlg // HDR10 (Mastering Display luminance) let edrMetaData = CAEDRMetadata.hdr10(minLuminance: minLuminance, maxLuminance: maxContentMasteringDisplayBrightness, opticalOutputScale: outputScale) // HDR10 (Supplemental Enhancement Information) let edrMetaData = CAEDRMetadata.hdr10(displayInfo: displayData, contentInfo: contentInfo, opticalOutputScale: outputScale)
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.