在创建NSOpenGLPFAColorFloat
时,将NSOpenGLPixelFormat
作为参数传递时,似乎macOS 10.12中出现了问题。我们基本上试图遵循Apple的Deep Image Display with OpenGL示例代码,以便在支持30位颜色(每个RGB颜色通道10位)的显示器上显示宽色域图像。
这涉及创建NSOpenGLPixelFormat
,NSOpenGLPFAColorSize
设置为64(即每RGBA像素64位)和NSOpenGLPFAColorFloat
启用(即16位半浮点子像素)。然后使用该像素格式创建NSOpenGLContext
,为每个子像素使用16位半浮点值,即每个RGBA像素为64位。
这一切都在macOS 10.11中有效。但是,在10.12下,我们的整个OpenGL窗口都呈现为褪色,就像它与灰色或白色框架混合一样。这就是它的样子 - 注意窗口的标题栏是正确呈现为深灰色,但是那个(我们的OpenGL视图)下方的所有内容都已消失:
10.12(褪色)
10.11(正确)
我已经确认我们的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
,但我真的不知道。
NSWindow
,NSView
和CAOpenGLLayer
上有各种属性,可以设置与宽色域/深度图像显示相关的属性。但到目前为止,他们都没有任何影响。到目前为止我尝试过的属性:
NSWindow.depthLimit = NSWindowDepthSixtyfourBitRGB
NSView.wantsExtendedDynamicRangeOpenGLSurface = YES
CAOpenGLLayer.wantsExtendedDynamicRangeContent = YES
CALayer.contentsFormat = kCAContentsFormatRGBA16Float
在这一点上,我已经尝试了所有我能想到的东西。如果有人有任何提示或建议,我将非常感谢他们。
答案 0 :(得分:0)
尝试检查colorspace
的{{1}}和窗口。
如果它们看起来不适合宽色域,请尝试更改它们。如果窗口是好的但图层不是,则最好将图层设置为与窗口匹配(即CAOpenGLLayer
)
或者您可以尝试将图层设置为layer.colorspace = window.colorspace.CGColorSpace;
,其名称为CGColorSpaceCreateWithName()
,kCGColorSpaceSRGB
,kCGColorSpaceExtendedSRGB
,kCGColorSpaceLinearSRGB
或{{ 1}}看看是否有任何帮助。