2010-12-12 51 views
4

J'utilise Windows 7. Je suis en train de programmer en utilisant OpenGL. Mais j'ai trouvé qu'il y a certaines fonctionnalités que je peux utiliser. Donc, je veux vérifier la version de l'OpenGL sur mon système. J'utilise le code ci-dessous pour vérifierComment vérifier la version de l'OpenGL sous Windows 7kl

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

Mais je reçois un pointeur NULL. Et si je veux mettre à niveau mon OpenGL, que dois-je faire?

Répondre

6

Vous avez besoin d'un contexte GL avant de pouvoir demander quelle version vous avez. Donc d'abord, créez un contexte, appelez wglMakeCurrent dessus, et vous devriez être capable d'appeler glGetString après cela.

La version signalée provient du pilote que vous avez installé. La version OpenGL que votre matériel peut prendre en charge n'est pas elle-même "évolutive" (car certaines fonctionnalités matérielles seront manquantes pour supporter les dernières et les meilleures).

Donc, le mieux que vous pouvez faire est de mettre à jour votre pilote, mais ne vous attendez pas à ce qu'il se termine par un OpenGL plus récent.

+1

@Kos: Je l'ai vu de nombreuses bases de code avec différentes approches sur la gestion du contexte. Je ne sais pas si le PO utilise un cadre ou non. Mais le principe de base s'applique toujours quel que soit le cadre (le cas échéant) utilisé. – Bahbar

+0

True. :) +1 de moi. – Kos

5

Le moyen le plus simple et le plus rapide consiste à utiliser un outil de diagnostic tel que GPU Caps Viewer. Vous pouvez également utiliser glGetString(GL_VERSION) mais n'oubliez pas que la version que vous aurez affichée est la version d'un contexte OpenGL donné - ce qui n'est pas forcément le plus élevé que votre GPU puisse faire. Cependant, si vous créez le contexte avec les paramètres par défaut, vous obtiendrez probablement le contexte OpenGL le plus élevé possible dans le profil de compatibilité, donc oui, cette méthode peut être utile.

De plus, comme le glGetString(GL_VERSION) fait référence à un contexte OpenGL donné, vous devez le créer au préalable. En fait, un contexte GL est nécessaire pour appeler toute fonctiongl*.


En effet, la mise à niveau des pilotes peut vous donner une version GL plus, mais il est peu probable que la version majeure changerait. Par exemple, si vous vous trouvez en charge de GL 3.1, il est très probable que les derniers pilotes vous donneront GL 3.3, mais pas GL 4.0.

0

essayez d'utiliser le code suivant, cela fonctionne pour moi:

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

Assurez-vous que vous incluez la chaîne et iostream dans votre programme.

0

Vous devez créer OpenGL Contexte (GTL) avant d'appeler 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; 

}