0

OK、私は attrib 構造体でバージョン 3.2 を使用して OpenGL コンテキストを作成することができましたwglcreatecontextattribARB(したがって、3.2 の opengl コンテキストを初期化しました)。

それは機能しますが、奇妙なことは、glBindBuffer を使用する場合です。まだ参照されていないリンカ エラーが発生しますが、新しいコンテキストでこれを防ぐべきではありませんか?

私はWindowsを使用していますが、Linuxは古いコンテキストと新しいコンテキストを処理する必要はありません(そのバージョンのコアを直接サポートしています)。コード:

PIXELFORMATDESCRIPTOR pfd;
    HGLRC tmpRC;
    int iFormat;
    if (!(hDC = GetDC(hWnd)))
    {
        CMsgBox("Unable to create a device context. Program will now close.", "Error");
        return false;
    }
    ZeroMemory(&pfd, sizeof(pfd));
    pfd.nSize = sizeof(pfd);
    pfd.nVersion = 1;
    pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = attribs->colorbits;
    pfd.cDepthBits = attribs->depthbits;
    pfd.iLayerType = PFD_MAIN_PLANE;
    if (!(iFormat = ChoosePixelFormat(hDC, &pfd)))
    {
        CMsgBox("Unable to find a suitable pixel format. Program will now close.", "Error");
        return false;
    }
    if (!SetPixelFormat(hDC, iFormat, &pfd))
    {
        CMsgBox("Unable to initialize the pixel formats. Program will now close.", "Error");
        return false;
    }
    if (!(tmpRC=wglCreateContext(hDC)))
    {
        CMsgBox("Unable to create a rendering context. Program will now close.", "Error");
        return false;
    }
    if (!wglMakeCurrent(hDC, tmpRC))
    {
        CMsgBox("Unable to activate the rendering context. Program will now close.", "Error");
        return false;
    }
    strncpy(vers, (char*)glGetString(GL_VERSION), 3);
    vers[3] = '\0';
    if (sscanf(vers, "%i.%i", &glv, &glsubv) != 2)
    {
        CMsgBox("Unable to retrieve the OpenGL version. Program will now close.", "Error");
        return false;
    }
    hRC = NULL;
    if (glv > 2) // Have OpenGL 3.+ support
    {
        if ((wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddress("wglCreateContextAttribsARB")))
        {
            int attribs[] = {WGL_CONTEXT_MAJOR_VERSION_ARB, glv, WGL_CONTEXT_MINOR_VERSION_ARB, glsubv,WGL_CONTEXT_FLAGS_ARB, 0,0};
            hRC = wglCreateContextAttribsARB(hDC, 0, attribs);
            wglMakeCurrent(NULL, NULL);
            wglDeleteContext(tmpRC);
            if (!wglMakeCurrent(hDC, hRC))
            {
                CMsgBox("Unable to activate the rendering context. Program will now close.", "Error");
                return false;
            }
            moderncontext = true;
        }
    }
    if (hRC == NULL)
    {
        hRC = tmpRC;
        moderncontext = false;
    }
4

1 に答える 1

4

あなたはまだする必要があります

  1. 適切な名前と関数シグネチャを使用して関数ポインターを宣言します。
  2. これらのポインターの正しいメモリ位置をフェッチしますwglGetProcAddress
  3. #実際の OpenGL API 名を対応する関数ポインターに定義します。

そうです、OpenGL API 関数は実際には関数ポインターです。

これを行う時間と忍耐がない場合は、GL3W や GLEW などの OpenGL ローダー ライブラリを使用することをお勧めします。これにより、最初にダミーのコンテキストを作成してから「実際の」コンテキストを作成する負担も軽減されます。

関数ポインタのロードに関する OpenGL wiki ページも参照してください。

于 2013-10-19T10:28:05.020 に答える