2010-12-12 5 views
4

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

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

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

ответ

6

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

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

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

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

+1

@Kos: Я видел много кода база с различными подходами по управлению контекстом. Я не знаю, использует ли OP фреймворк или нет. Но основной принцип по-прежнему применяется независимо от того, какая структура (если таковая имеется) используется. – Bahbar

+0

Правда. :) +1 от меня. – Kos

5

Самый простой и быстрый способ - использовать диагностический инструмент, например 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

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

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

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

0

Вы должны создать 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; 

} 
Смежные вопросы