- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个自定义的 Metal Core Image 内核(用 CIImageProcessorKernel
编写),我正在尝试使用 HDR 视频(HDR10 PQ 启动)正常工作。
我知道对于 HDR 视频,进入着色器的 rgb 值可以低于 0.0 或高于 1.0。但是,我不明白视频中的 10 位整数值(即 0-1023)是如何映射到浮点数的。
浮点数的最小值和最大值是多少? IE。 1023(纯白色)像素在着色器中的浮点数是多少。
WWDC20 11:32 session 10009,使用 AVFoundation 编辑和播放 HDR 视频,有一个 Core Image Metal 内核的示例,它不支持 HDR,因此无法工作。它通过从 1.0 中减去它们来反转传入的值,当 1.0 不是最大可能值时,这显然会崩溃。这应该如何实现才能感知 HDR?
extern “C” float4 ColorInverter(coreimage::sample_t s, coreimage::destination dest) {
return float4(1.0 - s.r, 1.0 - s.g, 1.0 - s.b, 1.0);
}
最佳答案
在您的内核中,颜色通常被标准化为 [0.0 ... 1.0]
,基于基础色彩空间。因此,即使值存储在纹理中的 10 位中间值中,您的着色器也会将它们作为标准化浮点数获取。
我强调了上面的颜色空间,因为它在将颜色从源转换为那些标准化值时使用。当您使用默认的 sRGB 色彩空间时,来自 HDR 源的广色域不适合 sRGB [0.0 ... 1.0]
光谱。这就是为什么您可能会在内核中获得该范围之外的值。这在大多数情况下实际上很有用,因为大多数为 sRGB 设计的过滤器操作仍然可以工作。然而,上面的颜色反转示例不是。
我知道你在这里有两个选择:
您可以更改 workingColorSpace
的CIContext
您正在使用输入的 HDR 色彩空间:
let ciContext = CIContext(options: [.workingColorSpace: CGColorSpace(name: CGColorSpace.itur_2020)!])
然后所有颜色值都应该被限制为
[0.0 ... 1.0]
在您的内核中,其中
0.0
是最暗的 HDR 颜色值和
1.0
是最亮的。您可以使用
1.0 - x
安全地执行反演。然后。但是,请记住,其他一些过滤器将不会产生正确的结果,因为它们假定输入为(线性)sRGB——Core Image 的默认值。
let colorSpace = CGColorSpace(name: CGColorSpace.itur_2020)!
let colorMatchedInput = inputImage.matchedFromWorkingSpace(to: colorSpace)
let kernelOutput = myKernel.apply(..., [colorMatchedInput, ...])
return kernelOutput.matchedToWorkingSpace(from: colorSpace)
关于ios - 如何在自定义 Metal Core Image Kernel 中正确处理 HDR10?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66912225/
我是一名优秀的程序员,十分优秀!