2010-12-12 5 views
4

Ich benutze die Windows 7. Ich programmiere mit dem OpenGL darauf. Aber ich habe festgestellt, dass es einige Funktionen gibt, die ich verwenden kann. Also ich möchte die Version von OpenGL auf meinem System überprüfen. ich den Code unten verwenden, es zu überprüfenWie überprüfe ich die Version von OpenGL unter Windows 7kl

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

Aber ich bekomme einen Null-Zeiger. Und wenn ich mein OpenGL aktualisieren möchte, was soll ich tun?

Antwort

6

Sie benötigen einen GL Kontext, bevor Sie fragen können, welche Version Sie haben.

Erstellen Sie zuerst einen Kontext, rufen Sie wglMakeCurrent darauf auf, und Sie sollten danach glGetString aufrufen können.

Die Version, die gemeldet wird, stammt von dem Treiber, den Sie installiert haben. Die OpenGL-Version, die Ihre Hardware unterstützen kann, ist nicht selbst "aktualisierbar" (da einige Hardware-Funktionen fehlen werden, um die neuesten und besten zu unterstützen).

Also das Beste, was Sie tun können, ist Ihren Treiber zu aktualisieren, aber nicht Ihre Hoffnungen zu hoch, es wird in einem neueren OpenGL führen.

+1

@Kos: Ich habe mit unterschiedlichen Ansätzen auf Kontextmanagement viele Codebasen gesehen. Ich weiß nicht, ob das OP einen Rahmen verwendet oder nicht. Aber das Grundprinzip gilt immer noch, wenn der Rahmen (falls vorhanden) verwendet wird. – Bahbar

+0

Wahr. :) +1 von mir. – Kos

5

Der einfachste und schnellste Weg ist die Verwendung eines Diagnosewerkzeugs wie GPU Caps Viewer.

Sie können auch glGetString(GL_VERSION) verwenden, aber denken Sie daran, dass die Version, die Sie angezeigt haben, die Version eines gegebenen OpenGL-Kontexts ist - das ist nicht unbedingt das Höchste, was Ihre GPU tun kann. Wenn Sie jedoch den Kontext mit Standardeinstellungen erstellen, erhalten Sie wahrscheinlich den höchstmöglichen OpenGL-Kontext im Kompatibilitätsprofil, also kann diese Methode nützlich sein.

Da sich der glGetString(GL_VERSION) auf einen gegebenen OpenGL-Kontext bezieht, müssen Sie ihn zuvor erstellen. Eigentlich ist ein GL Kontext erforderlich, um irgendeinegl* Funktion anzurufen.


der Tat die Treiber aktualisieren Sie eine höhere GL-Version geben kann, aber es ist unwahrscheinlich, dass die Hauptversion ändern würde. Wenn Sie zum Beispiel Unterstützung für GL 3.1 erhalten, ist es sehr wahrscheinlich, dass die neuesten Treiber Ihnen GL 3.3, aber nicht GL 4.0 geben.

0

versuchen, den folgenden Code zu verwenden, funktioniert es für mich:

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

Vergewissern Sie sich, dass Sie Zeichenfolge und Iostream in Ihrem Programm enthalten.

0

Sie müssen OpenGL Context (WGL) erstellen, bevor glGetString (GL_VERSION) Aufruf:

#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; 

} 
Verwandte Themen