15

Mac OS 10.14 Mojave 刚刚发布,从 6 月开始,我们就知道 OpenGL 将在 OS 中被弃用。“OpenGL 应用程序将继续运行,但你应该切换到 Metal,”来解释一下。但是,似乎没有任何文档表明您是否仍然可以使用 OpenGL 进行编译,或者 Apple 是否会阻止或省略适当的开发库。我目前正在开发一个基于 OpenGL 的图形程序,如果编译不再起作用,我不能冒险更新。有没有人测试过这个?

编辑:还有其他人分享 Esenthel 的经验吗?

4

11 回答 11

7

我可以编译,但是在更新到最新的 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 更新已经解决了这些问题。

于 2018-09-26T09:31:30.757 回答
5

GLFW 变通了。与其他答案类似,但您不需要在绘图循环中调整窗口大小,只需glfwPollEvents()先调用即可。

window = glfwCreateWindow(width-1, height, "Hello World", NULL, NULL);
glfwPollEvents();
glfwSetWindowSize(window, width, height);

此外,glfwHideWindow()thenglfwShowWindow()似乎工作。同样glfwSetWindowPos()是另一种选择。虽然设置窗口大小似乎比隐藏/显示窗口要快,但我不想移动窗口位置。

于 2018-12-14T00:51:41.147 回答
2

代码在

http://people.bath.ac.uk/abscjkw/ComputerPrograms/C++programs/OpenGL/MojaveOpenGL.cpp

使用 Xcode 10.0 在 Mojave 中运行良好。窗口会自动调整大小以消除黑色。OpenGL 和 GLUT 框架从通常的位置 /System/Library/Frameworks 添加到项目中

克里斯

于 2018-10-05T14:01:18.447 回答
1

截至今天(2018 年 10 月 21 日),Mojave 中的 OpenGL 存在漏洞。您必须移动 glfw 窗口位置才能真正看到它正在呈现的内容。

渲染循环中的这个解决方法代码对我有用:

if(!init)
{
    int x,y;
    glfwGetWindowPos(window,&x, &y);
    glfwSetWindowPos(window,x+1,y);     
    init = true;
}
于 2018-10-21T13:27:28.617 回答
1

我正在使用 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;
}

由于重塑回调是在显示之前触发的,因此它现在正在工作。

于 2018-10-26T09:43:55.027 回答
1

我正在使用 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(不是测试版)。

于 2018-09-28T16:53:28.233 回答
0

通过下载 Xcode 9.4.1 “修复”此问题

在其中编译并让我的应用程序与 OpenGL 视图正常工作。

我认为这与Layer-Backed Views有关。因为当我滚动我的 OpenGL 视图时,它在某些视图下变得可见......并且闪烁。我看到它在后面正确绘制。但是当我停止滚动时 - 它消失了。

于 2018-09-29T21:03:13.183 回答
0

在某些情况下,将窗口坐标移动 +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;
于 2019-01-11T10:33:40.990 回答
0

更新后我也遇到了这个。我正在使用glfw。实际上,创建的窗口可以在调整大小或移动后显示所需的内容。我glfwSetWindowPos(window, 100, 100);在主循环中添加了将其移动以作为临时解决方案。

于 2018-11-08T13:39:06.820 回答
0

我在 GLFW 中的解决方法是在主绘制循环中调用显示窗口。

 bool needDraw = true;
    if (needDraw) {
        glfwShowWindow(window);
        glfwHideWindow(window);
        glfwShowWindow(window);
        needDraw = false;
    }
于 2018-11-06T22:52:48.127 回答
0

某些 OpenGL 代码失败的原因是在 Mojave 中,您的视图是自动支持图层的。如果您的代码正在测试这种情况:

[NSGraphicsContext currentContextDrawingToScreen]

它将返回 NO 并且在该条件下的代码将不会运行(即:屏幕上没有绘制任何内容)。

不幸的是,您也不能在 Mojave 中将WantsLayer 设置为 NO,它不起作用。

于 2018-09-29T08:00:53.057 回答