Mac OS 10.14 Mojave 刚刚发布,从 6 月开始,我们就知道 OpenGL 将在 OS 中被弃用。“OpenGL 应用程序将继续运行,但你应该切换到 Metal,”来解释一下。但是,似乎没有任何文档表明您是否仍然可以使用 OpenGL 进行编译,或者 Apple 是否会阻止或省略适当的开发库。我目前正在开发一个基于 OpenGL 的图形程序,如果编译不再起作用,我不能冒险更新。有没有人测试过这个?
编辑:还有其他人分享 Esenthel 的经验吗?
Mac OS 10.14 Mojave 刚刚发布,从 6 月开始,我们就知道 OpenGL 将在 OS 中被弃用。“OpenGL 应用程序将继续运行,但你应该切换到 Metal,”来解释一下。但是,似乎没有任何文档表明您是否仍然可以使用 OpenGL 进行编译,或者 Apple 是否会阻止或省略适当的开发库。我目前正在开发一个基于 OpenGL 的图形程序,如果编译不再起作用,我不能冒险更新。有没有人测试过这个?
编辑:还有其他人分享 Esenthel 的经验吗?
我可以编译,但是在更新到最新的 Mojave 和 Xcode 后,我的 OpenGL 应用程序根本无法工作。
在一种情况下,我在系统 GL 调用期间挂起,在另一种情况下只是黑屏。输出中的一些错误与此处相同: https ://stackoverflow.com/questions/52507950/unable-to-load-info-plist-error-xcode-10-under-macos-10-14-mojave# =
建议不要更新。
我认为 Xcode 10 OpenGL 库中有一些问题。
编辑:似乎后来的 Mac OS 和 Xcode 更新已经解决了这些问题。
GLFW 变通了。与其他答案类似,但您不需要在绘图循环中调整窗口大小,只需glfwPollEvents()
先调用即可。
window = glfwCreateWindow(width-1, height, "Hello World", NULL, NULL);
glfwPollEvents();
glfwSetWindowSize(window, width, height);
此外,glfwHideWindow()
thenglfwShowWindow()
似乎工作。同样glfwSetWindowPos()
是另一种选择。虽然设置窗口大小似乎比隐藏/显示窗口要快,但我不想移动窗口位置。
代码在
http://people.bath.ac.uk/abscjkw/ComputerPrograms/C++programs/OpenGL/MojaveOpenGL.cpp
使用 Xcode 10.0 在 Mojave 中运行良好。窗口会自动调整大小以消除黑色。OpenGL 和 GLUT 框架从通常的位置 /System/Library/Frameworks 添加到项目中
克里斯
截至今天(2018 年 10 月 21 日),Mojave 中的 OpenGL 存在漏洞。您必须移动 glfw 窗口位置才能真正看到它正在呈现的内容。
渲染循环中的这个解决方法代码对我有用:
if(!init)
{
int x,y;
glfwGetWindowPos(window,&x, &y);
glfwSetWindowPos(window,x+1,y);
init = true;
}
我正在使用 GLUT 和 OpenGL。Xcode 10.0 和 10.1 beta3 都存在此问题。
如果您调整窗口大小,图形会在大多数情况下出现。
所以我设计了一个使用 reshape 回调函数的解决方法。假设我想激活一个 1000x1000 的窗口。我用 999x999 激活它,然后在 reshape 时根据需要将其转换为 1000x1000:
void reshape (int width, int height){
glutReshapeWindow (1000, 1000);
}
在主要方面:
int main (int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize( 999,999 );
glutInitWindowPosition (0.0f, 0.0f);
glutCreateWindow("example");
glutReshapeFunc (reshape);
glutDisplayFunc(draw);
glutKeyboardFunc(keyboard);
glutIdleFunc(idle);
glutMainLoop();
return 0;
}
由于重塑回调是在显示之前触发的,因此它现在正在工作。
我正在使用 GLEW、GLUT、OpenGL 2.0 和 SDL 2。我可以编译和运行我的 OpenGL 应用程序。但是我不得不更改我的框架搜索路径以包括:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks
现在放置了 OpenGL 和 GLUT 框架 + 标头,因为我在旧的搜索路径 System/Library/Frameworks 中找不到任何 OpenGL/GLUT 标头(尽管框架仍然存在,但没有包含标头)。我还必须确保我的包含是 GLUT/glut.h 而不仅仅是 glut.h。
这给了我以下形式的新警告消息:
[默认]无法加载Info.plist异常(eGPUOverrides)”和“保存的启用降噪设置与默认相同(=1)
我还没有检查它们,它们的含义是什么。
真正困扰我的是 Esentel 所说的,编译和运行应用程序后只有一个黑屏。我发现如果你拖动应用程序窗口(我没有使用全屏),那么动画就会开始显示。显然动画在后台并且所有代码都在评估,但是在我拖动窗口之前只有一个黑屏。
编辑:我正在使用 Mojave 和 Xcode 10(不是测试版)。
通过下载 Xcode 9.4.1 “修复”此问题
在其中编译并让我的应用程序与 OpenGL 视图正常工作。
我认为这与Layer-Backed Views有关。因为当我滚动我的 OpenGL 视图时,它在某些视图下变得可见......并且闪烁。我看到它在后面正确绘制。但是当我停止滚动时 - 它消失了。
在某些情况下,将窗口坐标移动 +1 不起作用。在这种情况下,我们以编程方式连续拖动窗口,直到它被渲染并通过键盘按下停止屏幕。交换缓冲区后将其添加到游戏循环中。
if (glfwGetKey( window, GLFW_KEY_Q ) == GLFW_RELEASE && !mac_moved){
int x, y;
glfwGetWindowPos(window, &x, &y);
glfwSetWindowPos(window, ++x, y);
} else {
mac_moved = true;
}
将 mac_moved 定义为顶部某处的静态变量。
static bool mac_moved = false;
更新后我也遇到了这个。我正在使用glfw。实际上,创建的窗口可以在调整大小或移动后显示所需的内容。我glfwSetWindowPos(window, 100, 100);
在主循环中添加了将其移动以作为临时解决方案。
我在 GLFW 中的解决方法是在主绘制循环中调用显示窗口。
bool needDraw = true;
if (needDraw) {
glfwShowWindow(window);
glfwHideWindow(window);
glfwShowWindow(window);
needDraw = false;
}
某些 OpenGL 代码失败的原因是在 Mojave 中,您的视图是自动支持图层的。如果您的代码正在测试这种情况:
[NSGraphicsContext currentContextDrawingToScreen]
它将返回 NO 并且在该条件下的代码将不会运行(即:屏幕上没有绘制任何内容)。
不幸的是,您也不能在 Mojave 中将WantsLayer 设置为 NO,它不起作用。