web-dev-qa-db-ja.com

Mac Mojave + OpenGL

Mac OS 10.14 Mojaveがリリースされたばかりで、6月以降、OpenGLがOSで非推奨になることがわかっています。 「OpenGLアプリケーションは引き続き実行されますが、Metalに切り替える必要があります」と言い換えます。ただし、OpenGLでcompileが可能かどうか、またはAppleがそれを防ぐか、適切な開発ライブラリを省略するかどうかを示すドキュメントはないようです。現在、OpenGLベースのグラフィックプログラムを開発していますが、コンパイルが機能しなくなった場合、更新のリスクはありません。誰もこれをテストしましたか?

編集:他の誰かがEsenthelの経験を共有していますか?

13
synchronizer

コンパイルできますが、最新の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のアップデートで問題が修正されたようです。

7
Esenthel

GLFWは回避します。他の回答と同様ですが、描画ループでウィンドウのサイズを変更する必要はありません。最初にglfwPollEvents()を呼び出すだけです。

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

また、glfwHideWindow()その後glfwShowWindow()は機能しているようです。同様に、glfwSetWindowPos()は代替です。ウィンドウサイズの設定は、ウィンドウの非表示/表示よりも高速であるように見えますが、ウィンドウの位置を移動したくありません。

5
Daniel Schwartz

のコード

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; }

1

GLUTとOpenGLを使用しています。この問題は、Xcode 10.0と10.1 beta3の両方に存在します。

ウィンドウのサイズを変更すると、ほとんどの場合グラフィックが表示されます。

そこで、reshapeコールバック関数を使用して回避策を考案しました。 1000x1000ウィンドウをアクティブにしたいとします。 999x999でアクティブにしてから、必要に応じて形状を変更して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;
}

Reshapeコールバックは表示前にトリガーされるため、現在は機能しています。

1
PNeves

GLEW、GLUT、OpenGL 2.0、SDL 2を使用しています。OpenGLアプリケーションをコンパイルして実行できます。ただし、フレームワークの検索パスを次のように変更する必要がありました。

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks

古い検索パスSystem/Library/FrameworksにOpenGL/GLUTヘッダーが見つからなかったため、OpenGLおよびGLUTフレームワーク+ヘッダーが配置されました(フレームワークはまだ存在していましたが、ヘッダーは含まれていませんでした)。また、インクルードが単なるglut.hではなくGLUT/glut.hであることを確認する必要がありました。

これにより、次の形式の新しい警告メッセージが表示されます。

[デフォルト] Info.plist例外(eGPUOverrides)をロードできません」と「ノイズキャンセルの有効化の保存設定はデフォルトと同じ(= 1)

私はまだそれらをチェックしていません、そしてそれらの意味は何ですか。

私が本当に悩むのは、Esenthelが言っていることで、アプリをコンパイルして実行した後に黒い画面が表示されるだけです。アプリウィンドウをドラッグすると(フルスクリーンを使用していない)、アニメーションが表示され始めることがわかりました。どうやらアニメーションはバックグラウンドにあり、すべてのコードが評価されていますが、ウィンドウをドラッグするまで黒い画面しかありません。

編集:私はMojaveとXcode 10(ベータ版ではありません)を使用しています。

1
Marcus Åkerman

また、更新後にこれに遭遇しました。 glfwを使用しています。実際、作成されたウィンドウは、サイズを変更または移動した後、目的のコンテンツを表示できます。一時的な解決のために、メインループにglfwSetWindowPos(window, 100, 100);を追加して移動しました。

0
Qian_Lin

Xcode 9.4.1をダウンロードしてこれを「修正」

コンパイルして、OpenGLビューを使用してアプリを正常に機能させました。

Layer-Backed Views のようなものだと思います。 OpenGLビューをスクロールすると、いくつかのビューの下で表示され、ちらつきます。そして、私はそれが後ろに正しく描かれているのを見ます。しかし、スクロールを停止すると、スクロールは消えます。

0
KAMIKAZE

GLFWでの私の回避策は、メイン描画ループでshow windowを呼び出すことです。

 bool needDraw = true;
    if (needDraw) {
        glfwShowWindow(window);
        glfwHideWindow(window);
        glfwShowWindow(window);
        needDraw = false;
    }
0
Nientai Ho

一部のOpenGLコードが失敗した理由は、Mojaveでは、ビューが自動的にレイヤーに対応しているためです。コードがこの状態をテストしている場合:

[NSGraphicsContext currentContextDrawingToScreen]

NOが返され、その条件下のコードは実行されません(つまり、画面に何も描画されません)。

残念ながら、MojaveでもWantsLayerをNOに設定することはできません。動作しません。

0
Kuro

場合によっては、ウィンドウの座標を+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;
0