2016-06-11 8 views
0

Ich habe Probleme mit OpenGL Einrichtung mit MSVS 2013. Ich bin mir bewusst, dass die opengl32.dll auf meiner Windows Plattform C:\Windows\System32 gelegen ist eine Implementierung von OpenGL 1.1.Laden OpenGL> 1.1 Funktionen von Windows

Ich versuche, die neueren OpenGL> 1.1 Funktionen wie glBindBuffer und glBufferData zu laden. Ich habe gelesen, dass es möglich ist, mit wglGetProcAddress einen Zeiger auf die Funktion zu bekommen. Wenn diese Funktion verwendet wird, ist der zurückgegebene Zeiger immer Null, alle ursprünglichen Funktionen in der DLL funktionieren einwandfrei, außer dass die neueren Funktionen nicht zu laden scheinen.

Ich hoffe, dass jemand hier mir helfen kann, mein Setup durchzugehen und darauf hinzuweisen, was ich falsch gemacht habe oder ob ich etwas verpasst habe.

So hier gehen wir:

  • Ich habe OpenGL Extensions Viewer 4.4 heruntergeladen, die ich in der Lage weist darauf hin, bis zu OpenGL perfekt laufen 2.1, welche sollte mehr als genug sein zu verwenden oder Last glBindBuffer und glBufferData .

  • Ich habe Microsoft SDKs/v7.1 heruntergeladen, die die Header enthält: gl/glu.h und gl/gl.h; Ich habe auch die GLEXT Extensions API von here heruntergeladen und verknüpft die glext.lib + die Header enthalten.

  • Dateien im Linker:

C: \ Programme \ Microsoft SDKs \ Windows \ v7.1 \ Lib \ opengl32.lib

C: \ Programme \ Microsoft SDKs \ Windows \ v7.1 \ lib \ GLu32.lib

C: \ Benutzer \ Benutzer \ Desktop \ glext \ lib \ glext.lib

  • Die CPP-Dateien enthalten:

C: \ Programme \ Microsoft SDKs \ Windows \ v7.1 \ Include -> gl.h, glu.h

C: \ Benutzer \ Benutzer \ Desktop \ glext \ include -> glcorearb.h, glext.h, wglext.h

+0

Haben auch Sie eine OpenGL-Kontext erstellt, bevor 'wglGetProcAddress' Aufruf? – user815923

Antwort

5

Statt all diese Details, sich von der Handhabung, empfehle ich Ihnen, sich nur eine Kopie von GLEW greifen (http://glew.sourceforge.net/), die kümmert sich um alle davon für Sie in einer Standardform. Ich verwende es derzeit auf mehreren veröffentlichten Produkten ohne Probleme.

In Ihrem Beispiel werde Sie in der Lage sein, Folgendes zu tun:

if (GL_ARB_multi_bind) { 
    //glBindBuffer is available. 
} 

(natürlich nach einem Aufruf glewInit(), möglicherweise mit glewExperimental = TRUE; - Dokumentation sehen.)

+0

Hallo, danke für deinen Kommentar. Ich bin mir der glew-Bibliothek bewusst, aber ich würde es gerne ohne sie machen, da dies nur ein kleiner Teil eines größeren Projekts ist, ich möchte alles so leicht wie möglich halten. – MircoProgram

+0

@MircoProgram Ehrlich gesagt, es ist eine reine Header-Lösung, so dass Sie nicht viel in Bezug auf Leistung, Kompilierzeit oder binäre Größe beeinflussen würden. Sie werden sicherstellen, dass Sie die Dinge richtig machen, und das Hinzufügen von Funktionen ist trivial. –

+0

@MikeWeir: GLEW ist * nicht * eine "nur-Header" -Bibliothek (nicht, wenn sich nicht kürzlich etwas geändert hat). Nun, GLEW ist auch keine schwergewichtige Komponente, es gibt also immer noch keinen legitimen Grund, sie oder eine andere Ladebibliothek nicht zu benutzen. –

0

Ich denke, dass das Problem ist, dass es keinen aktuellen Kontext beim Aufruf von wglGetProcAddress gibt.

Funktionszeiger können für ein genaues Pixelformat spezifisch sein, das durch die Kontexterstellungsverfahren bestimmt wird.

1

Bei der Verwendung dieser Funktion ist der zurückgegebene Zeiger immer Null, alle ursprünglichen Funktionen in der DLL mit GetProcAddress (OpenGL32DLL, "...") funktionieren perfekt, außer die neueren Funktionen scheinen nicht zu laden.

Haben Sie einen gültigen OpenGL-Kontext erstellt und auf dem aufrufenden Thread aktuell gemacht? In Windows sind Erweiterungsfunktionen technisch pro Kontext, d. H. Sie müssen die Zeiger auf die Funktionen für jeden von Ihnen erstellten OpenGL-Kontext abrufen und sicherstellen, dass die richtigen Funktionszeiger mit dem richtigen Kontext verwendet werden.

Dies bedeutet natürlich auch, dass Sie zunächst einen OpenGL-Kontext haben müssen. Die übliche Reihenfolge der Einstellung eines OpenGL-Kontext in Windows up ist:

Pseudo-Code

struct glctx { 
    HGLRC rc 
    // dictionary for explanation purposes 
    // one would normally just have a bunch of 
    // structure elements here 
    functionpointer[string:name] extensionfunction 
} 

if not window_with_desired_pixelformat_exists: { 
    wnd := create_a_window 
    pixelformat := select_pixelformat 
    wnd→set_pixelformat pixelformat 
} 
dc := wnd→getDC 

glctx ctx 
ctx→rc := wglCreateContext(dc) 
wglMakeCurrent(dc, ctx→rc); 

foreach(fname in extensionfunctions_names): { 
    ctx→extensionfunction[name] = wglGetProcAddress(name) 
} 
Verwandte Themen