web-dev-qa-db-ja.com

MavericksでのOpenGL 4.1(?)

MacBook ProをXcodeを含むMavericks(MacOS 10.9)にアップグレードしました。 Appleの「OpenGL機能テーブル」によると、このバージョンはOpenGL 4.1をサポートしていますが、glGetString(GL_VERSION)への呼び出しは「1.2」を返し、「#version 330」で始まるGLSL 3.30シェーダーはロードを拒否し、そのバージョンを伝えますはサポートされていません。

4.1サポートを有効にするためにMavericksに何かをする必要がありますか?

22
user2507282

OS Xの下位レベルのAPIの1つを使用してピクセル形式を要求する場合、コアプロファイルを使用するには、次のものを属性リストに追加する必要があります。

CGL:

  kCGLPFAOpenGLProfile,     kCGLOGLPVersion_3_2_Core

NSOpenGL:

  NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion3_2Core

ここで、特定の定数の名前は...3_2Core、それが実際に意味することは、すべての廃止予定機能を削除し、少なくともOpenGL 3.2をサポートするコンテキストを要求することです(つまり、コアプロファイル)。これと同じ定数を使用して4.1または3.3コンテキストを取得できます。正直なところ、定数に実際のバージョン番号を含めることは、おそらく不適切な選択でした。

ピクセル形式を要求するときにこれを指定しない場合、OS XはkCGLOGLPVersion_LegacyまたはNSOpenGLProfileVersionLegacyそれぞれ。これにより、OpenGL 2.1の機能に制限されます。

より高いレベルのフレームワークを使用している場合は、APIリファレンスを参照する必要があります。ただし、OS Xでは、OpenGL 2.1より新しいものにアクセスするにはcoreプロファイルコンテキストが必要であることに注意してください。

22

OpenGLライブラリGLFWを使用してください最新バージョンは3.0.4です... glfw initを初期化した直後

if (!glfwInit())
{
    printf("glfwInit() fail to initualize. \n");
    glfwTerminate();
    exit(-1);
}

初期化後glfwInit()これらの4行のコードを含めます。この4行のコードにより、OSでサポートされている最高バージョンを使用できます。 Macでは、opengl 4.1

glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);

次に、ウィンドウを作成します。

_Window = glfwCreateWindow(width, height, title, 0, 0);

作成されたことを確認してください。

if (!_Window) {
    printf("Display window fail to create. \n");
    glfwTerminate();
    exit(-1);
}

次に、次のようにして現在のウィンドウにします。

glfwMakeContextCurrent(_Window);

あなたがそれをあなたの治癒力のある窓にした後、やらなければならないことはメインループを作成することです。

while (!glfwWindowShouldClose(_Window))
{
    ........
    glfwSwapBuffers(_Window);
    glfwPollEvents();
}

glfwPollEvents()が含まれていることを確認してください。ループでは、これにより、閉じるボタンを使用してウィンドウを終了することができます。ライブラリをxcodeでコンパイルできない場合は、ここにメッセージを送ってください。ライブラリのコピーをお送りします。

13
kanthonye

私はこれに長い間苦労し、ついにグラフィックスカードでサポートされている任意のglslバージョンを使用することに成功しました。

主なポイントはいくつかあります。

  1. コアプロファイルを使用
  2. MAJOR.MINORをGL使用したいバージョンに設定します
  3. 最新バージョンのGLが使用されていない場合は、FORWARD COMPATIBILITYを有効にする必要があります。

たとえば、@ kanthonyeで指摘されているように、glfwを使用していて、glバージョン3.2を使用している場合は、次の行が必要です。

glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
2
squid

LWJGL(バージョン2.90以降)を使用している場合、 ContextAttribsのjavadocヘッダー にちょっとした落とし穴があります。

...この拡張機能はMacOS Xではサポートされていません。ただし、MacOS X 10.7以降でGL 3.2コンテキストを有効にするには、このクラスのインスタンスをLWJGLに渡す必要があります。有効な構成はContextAttribs(3、2、CONTEXT_CORE_PROFILE_BIT_ARB)のみで、それ以外は無視されます。

1
Philip

http://support.Apple.com/kb/HT5942

サイトのタイトルは「Macコンピューター:OS X MavericksでのOpenCLおよびOpenGLサポート-OS X MavericksでコンピューターがサポートするOpenGLおよびOpenCLバージョンについて説明します。」

1
klarheit

SDLを高レベルAPIとして使用している場合、4.1のサポートを受けるには、いくつかのことを行う必要があります。

まず最初に、SDL2 2.0.1(またはそれ以降)があることを確認してください。たとえば、brewを使用します。

brew update brew upgrade sdl2

次に、SDLにコアプロファイルをリクエストするように具体的に指示する必要があります。

SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK、SDL_GL_CONTEXT_PROFILE_CORE);

3番目に、コアプロファイルがMacでどのように要求されるかについての癖は、実際には4.1を取得するために3.2を要求する必要があります(!)。これはSDL2リポジトリで修正されたと思いますが、まだリリースされていません。

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION、3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION、2);

0
Martin