OpenGL无法在macOS Mojave上渲染

时间:2018-10-22 22:22:31

标签: macos opengl nsview nsopenglview nsopengl

如果在macOS Mojave上创建NSView和自定义NSOpenGLContext,则在调整窗口大小之前不会渲染窗口。但是,如果您使用NSOpenGLView则一切正常。 我发现有很多骇客会在渲染到窗口之前以编程方式调整窗口大小(http://people.bath.ac.uk/abscjkw/ComputerPrograms/C++programs/OpenGL/MojaveOpenGL.cpp,或者两次调用[NSOpenGLContext update]https://github.com/go-gl/glfw/pull/229/commits/9e6129a572227a13ff9acb4904443d2ae7d66e77),但它们看起来确实很骇且不可靠。

3 个答案:

答案 0 :(得分:4)

我拆解了Apple的框架,发现它们已经改变了OpenGL渲染在Mojave上的工作方式。看来,即使通过将NSView的{​​{1}}设置为wantsLayer来禁用分层支持,NO仍会在Mojave上创建并附加一层到您的视图上。在渲染窗口之前调整窗口大小是可行的,因为通常会导致调用NSView。两次调用更新都是可行的,因为在第一帧[NSOpenGLContext update]上没有附加任何层,而update方法除了在第二帧上没有任何作用外,其余的层都在那里,并且NSView实际上初始化了帧缓冲区。 / p>

因此解决方案是在设置[NSOpenGLContext update]的层时手动调用[NSOpenGLContext update],如下所示:

NSView

我对其进行了测试,它在Mojave和旧版本的macOS上均可工作(在macOS 10.13和旧版本上未调用@interface OpenGLView: ViewMacOS { NSOpenGLContext* _openGLContext; } @end @implementation OpenGLView -(void)setLayer:(CALayer*)layer { [super setLayer:layer]; [_openGLContext update]; } @end )。这是我对Ouzel引擎所做的完整提交:https://github.com/elnormous/ouzel/commit/7e708636189d970bad6b013ecd5375cfe693f3f3

答案 1 :(得分:0)

在我的手动管理NSOpenGLContext的NSView子类上,我需要调用NSView.displayIfNeeded而不是NSView.display进行缓冲区交换。覆盖NSView.setLayer并调用NSOpenGLContext.update没有帮助。

请注意,我的用法类似于SDL,其中使用了自定义运行循环,因此在海报程序中可能并非如此。

答案 2 :(得分:0)

更新到Mojave 10.14.3和Xcode 10.1后,此问题已得到解决。