2016-04-16 11 views
0

GLFWロード機能

OpenGLの初期化の2つのフェーズがあります。最初の段階は、OpenGLコンテキストの作成です( )。 2番目の段階は、OpenGLを使用するために必要なすべての関数をロードすることです。

この定型作業は、さまざまなOpenGLロードライブラリで行われます。

私はGLFWをダウンロードし、ライブラリのデモテストをコンパイルしました。しかし、フレームワークがウィンドウの作成とコンテキストの作成を1つの関数呼び出しcreateWindowにマージして、最初にウィンドウとコンテキストを作成し、次にinitWGLExtensionsでいくつかの拡張関数をロードすることがわかります。

他のgl関数をロードせずにコンテキストを設定できるようになりました。簡単なデモでは、描画するmsgループを開始します。

int main(void) 
{ 
    GLFWwindow* window; 

    glfwSetErrorCallback(error_callback); 

    if (!glfwInit()) 
     exit(EXIT_FAILURE); 

    window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL); 
    if (!window) 
    { 
     glfwTerminate(); 
     exit(EXIT_FAILURE); 
    } 

    glfwMakeContextCurrent(window); 
    glfwSwapInterval(1); 

    glfwSetKeyCallback(window, key_callback); 

    while (!glfwWindowShouldClose(window)) 
    { 
     float ratio; 
     int width, height; 

     glfwGetFramebufferSize(window, &width, &height); 
     ratio = width/(float) height; 

     glViewport(0, 0, width, height); 
     glClear(GL_COLOR_BUFFER_BIT); 

     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f); 
     glMatrixMode(GL_MODELVIEW); 

     glLoadIdentity(); 
     glRotatef((float) glfwGetTime() * 50.f, 0.f, 0.f, 1.f); 

     glBegin(GL_TRIANGLES); 
     glColor3f(1.f, 0.f, 0.f); 
     glVertex3f(-0.6f, -0.4f, 0.f); 
     glColor3f(0.f, 1.f, 0.f); 
     glVertex3f(0.6f, -0.4f, 0.f); 
     glColor3f(0.f, 0.f, 1.f); 
     glVertex3f(0.f, 0.6f, 0.f); 
     glEnd(); 

     glfwSwapBuffers(window); 
     glfwPollEvents(); 
    } 

    glfwDestroyWindow(window); 

    glfwTerminate(); 
    exit(EXIT_SUCCESS); 
} 

したがって、すべてのレンダリングコマンド機能はオンザフライで表示されますか?それは実際にGL.hで宣言されました。したがって、フレームワークはドライバからこれらの機能をロードしていないためです。で、これらの機能に常駐している?[質問]

そしてGLFWによってロードされたすべての機能が

src\wgl_context.h(39):typedef PROC (WINAPI * WGLGETPROCADDRESS_T)(LPCSTR); 
src\wgl_context.h(44):#define _glfw_wglGetProcAddress _glfw.wgl.opengl32.GetProcAddress 
src\wgl_context.h(89):  WGLGETPROCADDRESS_T GetProcAddress; 
src\wgl_context.c(42):  _glfw_wglGetProcAddress("wglGetExtensionsStringEXT"); 
src\wgl_context.c(44):  _glfw_wglGetProcAddress("wglGetExtensionsStringARB"); 
src\wgl_context.c(48):  _glfw_wglGetProcAddress("wglCreateContextAttribsARB"); 
src\wgl_context.c(52):  _glfw_wglGetProcAddress("wglSwapIntervalEXT"); 
src\wgl_context.c(56):  _glfw_wglGetProcAddress("wglGetPixelFormatAttribivARB"); 
src\wgl_context.c(289): _glfw.wgl.opengl32.GetProcAddress = (WGLGETPROCADDRESS_T) 
src\wgl_context.c(290):  GetProcAddress(_glfw.wgl.opengl32.instance, "wglGetProcAddress"); 
src\wgl_context.c(659): const GLFWglproc proc = (GLFWglproc) _glfw_wglGetProcAddress(procname); 

のようなものである場合、これは私が他のGL関数をロードする必要がなかったことを意味するのでしょうか?[[質問]] GLワークフローについてちょっと混乱します。

UPDATE

関数呼び出しがopengl32.libにリンクされているものをGLをご覧ください。これは何を意味するのでしょうか? windows10では、デフォルトの1.1 gl実装を使用していますか?だから、実際には、実際にドライバからnvoglv32.dll​というようにこれらの関数をエクスポートする必要はありませんが、opengl32.libに静的リンクされた関数を使用しますか?

答えて

3

OpenGL wikiの文言は少し不運です。詳細はもう少し複雑です。 3つの事は、OpenGL環境にあります。

  • オペレーティングシステムABI(アプリケーションバイナリインタフェース)契約
  • OpenGLコンテキスト
  • ウィンドウシステムインテグレーション

歴史的にOpenGLはとの統合方法OpenGLはグラフィックスドライバとの会話のために設計されたAPIなので、サードパーティのライブラリをインストールすることはできません。そのインタフェースの特定のセットは、オペレーティングシステムによって提供されなければならない。これらのインタフェースは、ABI契約で正確に記述されています。もちろん、各OSには独自の契約があり、バージョン間で変更される可能性もあります。

新しいバージョンのOpenGLをサポートするために、いわゆる「拡張メカニズム」が定義されており、ABI契約外の機能をロードすることができます。 ABI契約の一部である機能は、このメカニズムによっても利用可能であるかもしれないし、そうでないかもしれない*ので、その仮定に頼らないでください。

Windowsでは(Win-NT-4およびWin-95B以降)ABI契約により、プログラムはとなり、常にに準拠したOpenGL-1.1実装が見つかります。わかりやすくするために、OpenGL-1.1エントリポイントは、インターフェイススタブライブラリ(opengl32.dll、シンボルテーブルはopengl32.libで利用可能)で直接公開されます。デバイスドライバをそのスタブライブラリに接続し、OpenGL実装の終わりにハードウェアと通信します。すべてのOpenGLコンテキストでは、OpenGL-1.1スタブは不変であり、すべてのコンテキストで同じです。拡張機能OTOHは各コンテキストに固有です。したがって、作成された各OpenGLコンテキストに対して、拡張機能ポインタは個別にロードされ、呼び出されるとアクティブなコンテキストに適切にマッチする必要があります。また、拡張機能をロードしようとする前に、コンテキストを作成してアクティブにする必要があることも意味します。 X11/GLX環境(例えばLinuxでは、*のBSD、Solarisの場合)で

状況は以下の通りである:ABI契約は OpenGLが利用可能な場合ことを指定し、OpenGLの-1.2 必見の、その後少なくとも機能が OpenGL の実装共有オブジェクトによってエクスポートされます。これは特に注目に値する! Windowsにはベンダーに中立なスタブがいくつかありますが、X11/GLXのlibGL.soプログラムは動的にをロードし、実装はです。また、libGL.soははるかに多くのシンボルをエクスポートする可能性があり、サポートされているすべてのOpenGL機能をカバーする可能性があります。プログラマとして、これに頼るべきではありません。また、GLXでは、すべてのエントリポイントがコンテキスト不変であると主張しています。つまり、一度ロードしてすべてのコンテキストで再利用できます。

MacOS-Xでは、OpenGLをフレームワークで取得します。 ABI契約はOSバージョンごとであるため、プログラムで使用できるOpenGL機能は特定のOSバージョンによって完全に決定されます。拡張メカニズムはありますが、目的を果たすことはほとんどありません。アップル特有のエクステンションがいくつか輸出されているだけなので、アップルのOSでそれを気にしないでください。

+0

1. OpenGL32.libからのGL関数は、実際のドライバが 'nvogl32.dll'と書かれたスタブである' opengl32.dll'のdynamicllyに読み込まれたものに再配置され、最後に呼び出しはこれに委譲されますドライバ? 2.Windowsでgl(> 1.1)の後のバージョンで指定されたインターフェースを使用したい場合は、ドライバから明示的にロードする必要がありますか? 'procadress'というキーワードの検索結果が上に挙げたもののほんの少ししか一致していないので、明らかに' GLFW'フレームワークでは行われません。 – zoujyjs

+0

@zoujyjs:** 1について)** 'opengl32.lib'には関数がまったく含まれていません。これは、DLLへの参照と使用可能な関数(つまり、DLLを手元に置かずに実行可能ファイルを作成できるようにする)を追加するようにリンカに指示する目次に過ぎません。 *残りの部分にはスポットがあります!* - ** 2)について**関数ポインタをロードするために使用される関数は、OS固有のものです。 Windowsでは、GLXで 'glXGetProcAddress'と呼ばれています。(詳細はhttps://www.opengl.org/wiki/Load_OpenGL_Functionsを参照してください) – datenwolf

+0

@zoujyjs:しかし、通常、あなたは退屈な仕事を次のような専用のローダーライブラリに委譲します。 GLEWまたはglLoadGen。 https://www.opengl.org/wiki/OpenGL_Loading_Library – datenwolf

関連する問題