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
に静的リンクされた関数を使用しますか?
1. OpenGL32.libからのGL関数は、実際のドライバが 'nvogl32.dll'と書かれたスタブである' opengl32.dll'のdynamicllyに読み込まれたものに再配置され、最後に呼び出しはこれに委譲されますドライバ? 2.Windowsでgl(> 1.1)の後のバージョンで指定されたインターフェースを使用したい場合は、ドライバから明示的にロードする必要がありますか? 'procadress'というキーワードの検索結果が上に挙げたもののほんの少ししか一致していないので、明らかに' GLFW'フレームワークでは行われません。 – zoujyjs
@zoujyjs:** 1について)** 'opengl32.lib'には関数がまったく含まれていません。これは、DLLへの参照と使用可能な関数(つまり、DLLを手元に置かずに実行可能ファイルを作成できるようにする)を追加するようにリンカに指示する目次に過ぎません。 *残りの部分にはスポットがあります!* - ** 2)について**関数ポインタをロードするために使用される関数は、OS固有のものです。 Windowsでは、GLXで 'glXGetProcAddress'と呼ばれています。(詳細はhttps://www.opengl.org/wiki/Load_OpenGL_Functionsを参照してください) – datenwolf
@zoujyjs:しかし、通常、あなたは退屈な仕事を次のような専用のローダーライブラリに委譲します。 GLEWまたはglLoadGen。 https://www.opengl.org/wiki/OpenGL_Loading_Library – datenwolf