在macOS 10.12(Sierra)中,NSOpenGLPFAColorFloat在宽色域(30位)渲染中被破坏了吗?

时间:2016-11-19 01:55:20

标签: macos cocoa opengl core-animation macos-sierra

在创建NSOpenGLPFAColorFloat时,将NSOpenGLPixelFormat作为参数传递时,似乎macOS 10.12中出现了问题。我们基本上试图遵循Apple的Deep Image Display with OpenGL示例代码,以便在支持30位颜色(每个RGB颜色通道10位)的显示器上显示宽色域图像。

这涉及创建NSOpenGLPixelFormatNSOpenGLPFAColorSize设置为64(即每RGBA像素64位)和NSOpenGLPFAColorFloat启用(即16位半浮点子像素)。然后使用该像素格式创建NSOpenGLContext,为每个子像素使用16位半浮点值,即每个RGBA像素为64位。

这一切都在macOS 10.11中有效。但是,在10.12下,我们的整个OpenGL窗口都呈现为褪色,就像它与灰色或白色框架混合一样。这就是它的样子 - 注意窗口的标题栏是正确呈现为深灰色,但是那个(我们的OpenGL视图)下方的所有内容都已消失:

10.12(褪色)

10.12 (Faded)

10.11(正确)

enter image description here

我已经确认我们的OpenGL渲染是正确的。如果我在渲染后使用glReadPixels()来读取帧缓冲区的内容,那么帧缓冲区的内容是正确的 - 内容不会褪色,它们确实包含正确的“深度”(每个子块大于8位)像素)颜色数据。褪色渲染似乎发生在我们的应用程序之外的某个地方,可能是由窗口合成器或其他东西。因此,这是一个macOS 10.12错误,或者我们在设置NSWindow,NSView或CAOpenGLLayer时没有做正确的事情。

Apple的Deep Image Display with OpenGL示例似乎在10.12上正常运行。但是,它的工作方式和应用程序的工作方式之间存在一些差异。我们的像素格式略有不同:

NSOpenGLPixelFormatAttribute attrs[] = {
    NSOpenGLPFANoRecovery,
    NSOpenGLPFAColorSize, 64,
    NSOpenGLPFAColorFloat,
    NSOpenGLPFADepthSize, 16,
    NSOpenGLPFAAccelerated,
    0
};

主要区别在于Apple的示例正在使用NSOpenGLProfileVersion4_1Core而我们正在使用NSOpenGLProfileVersionLegacy(如果未指定配置文件,则为默认值)。因此,它可能适用于4.1 Core配置文件,但不适用于旧版(Pre-OpenGL 3.0)配置文件。

另一个区别是Apple的样本正在使用NSOpenGLView的子类,而我们正在使用NSView的子类,其子类为CAOpenGLLayer,我们在那里进行OpenGL渲染。我怀疑问题可能出在CAOpenGLLayer,但我真的不知道。

NSWindowNSViewCAOpenGLLayer上有各种属性,可以设置与宽色域/深度图像显示相关的属性。但到目前为止,他们都没有任何影响。到目前为止我尝试过的属性:

  • NSWindow.depthLimit = NSWindowDepthSixtyfourBitRGB
  • NSView.wantsExtendedDynamicRangeOpenGLSurface = YES
  • CAOpenGLLayer.wantsExtendedDynamicRangeContent = YES
  • CALayer.contentsFormat = kCAContentsFormatRGBA16Float

在这一点上,我已经尝试了所有我能想到的东西。如果有人有任何提示或建议,我将非常感谢他们。

1 个答案:

答案 0 :(得分:0)

尝试检查colorspace的{​​{1}}和窗口。

如果它们看起来不适合宽色域,请尝试更改它们。如果窗口是好的但图层不是,则最好将图层设置为与窗口匹配(即CAOpenGLLayer

或者您可以尝试将图层设置为layer.colorspace = window.colorspace.CGColorSpace;,其名称为CGColorSpaceCreateWithName()kCGColorSpaceSRGBkCGColorSpaceExtendedSRGBkCGColorSpaceLinearSRGB或{{ 1}}看看是否有任何帮助。