Как проверить версию OpenGL на Windows 7кл - PullRequest
4 голосов
/ 12 декабря 2010

Я использую Windows 7. Я программирую, используя OpenGL на нем.Но я обнаружил, что есть некоторые функции, которые я могу использовать.Поэтому я хочу проверить версию OpenGL в моей системе.Я использую код ниже, чтобы проверить это

const char* version = (const char*)glGetString(GL_VERSION); 

Но я получаю нулевой указатель.И если я хочу обновить свой OpenGL, что мне делать?

Ответы [ 4 ]

6 голосов
/ 12 декабря 2010

Вам нужен текущий контекст GL, прежде чем вы сможете спросить, какая у вас версия.

Итак, сначала создайте контекст, вызовите для него wglMakeCurrent, и после этого вы сможете вызывать glGetString.

Версия, о которой сообщается, исходит от установленного вами драйвера. Версия OpenGL, которую может поддерживать ваше аппаратное обеспечение, сама по себе не является «обновляемой» (поскольку некоторые аппаратные функции будут отсутствовать, чтобы поддерживать новейшие и лучшие версии).

Таким образом, лучшее, что вы можете сделать, это обновить драйвер, но не надейтесь, что это приведет к более новому OpenGL.

5 голосов
/ 12 декабря 2010

Самый простой и быстрый способ - использовать диагностический инструмент, такой как GPU Caps Viewer .

Вы также можете использовать glGetString(GL_VERSION), но помните, что версия, которую вы отобразили, является версией данного контекста OpenGL - что не обязательно является максимальным значением, которое может сделать ваш GPU. Однако если вы создадите контекст с настройками по умолчанию, вы, вероятно, получите максимально возможный контекст OpenGL в профиле совместимости, поэтому да, этот метод может быть полезен.

Кроме того, поскольку glGetString(GL_VERSION) относится к заданному контексту OpenGL, его необходимо создать заранее. На самом деле, контекст GL необходим для вызова любой gl* функции.


Действительно, обновление драйверов может дать вам более высокую версию GL, но маловероятно, что основная версия изменится. Например, если вы обнаружите, что поддерживаете GL 3.1, весьма вероятно, что последние версии драйверов предоставят вам GL 3.3, но не GL 4.0.

0 голосов
/ 07 февраля 2014

Вам необходимо создать контекст OpenGL (WGL) перед вызовом glGetString (GL_VERSION):

#include <windows.h>
#include <GL/GL.h>

#pragma comment (lib, "opengl32.lib")

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

int WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
        MSG msg          = {0};
        WNDCLASS wc      = {0}; 
        wc.lpfnWndProc   = WndProc;
        wc.hInstance     = hInstance;
        wc.hbrBackground = (HBRUSH)(COLOR_BACKGROUND);
        wc.lpszClassName = L"oglversionchecksample";
        wc.style = CS_OWNDC;
        if( !RegisterClass(&wc) )
                return 1;
        CreateWindowW(wc.lpszClassName,L"openglversioncheck",WS_OVERLAPPEDWINDOW|WS_VISIBLE,0,0,640,480,0,0,hInstance,0);

        while( GetMessage( &msg, NULL, 0, 0 ) > 0 )
                DispatchMessage( &msg );

        return 0;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        switch(message)
        {
        case WM_CREATE:
                {
                PIXELFORMATDESCRIPTOR pfd =
                {
                        sizeof(PIXELFORMATDESCRIPTOR),
                        1,
                        PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,    //Flags
                        PFD_TYPE_RGBA,            //The kind of framebuffer. RGBA or palette.
                        32,                        //Colordepth of the framebuffer.
                        0, 0, 0, 0, 0, 0,
                        0,
                        0,
                        0,
                        0, 0, 0, 0,
                        24,                        //Number of bits for the depthbuffer
                        8,                        //Number of bits for the stencilbuffer
                        0,                        //Number of Aux buffers in the framebuffer.
                        PFD_MAIN_PLANE,
                        0,
                        0, 0, 0
                };

                HDC ourWindowHandleToDeviceContext = GetDC(hWnd);

                int  letWindowsChooseThisPixelFormat;
                letWindowsChooseThisPixelFormat = ChoosePixelFormat(ourWindowHandleToDeviceContext, &pfd); 
                SetPixelFormat(ourWindowHandleToDeviceContext,letWindowsChooseThisPixelFormat, &pfd);

                HGLRC ourOpenGLRenderingContext = wglCreateContext(ourWindowHandleToDeviceContext);
                wglMakeCurrent (ourWindowHandleToDeviceContext, ourOpenGLRenderingContext);

                MessageBoxA(0,(char*)glGetString(GL_VERSION), "OPENGL VERSION",0);

                wglDeleteContext(ourOpenGLRenderingContext);
                PostQuitMessage(0);
                }
                break;
        default:
                return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;

} 
0 голосов
/ 15 февраля 2011

попробуйте использовать следующий код, он работает для меня:

cout << "OpenGL Version : " << glGetString(GL_VERSION) << endl;  

Убедитесь, что вы включили строку и iostream в вашу программу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...