2016-06-11 63 views
0

我無法建立的OpenGL與MSVS 2013年我知道,在位於C:\Windows\System32我的Windows 平臺OPENGL32.DLL是OpenGL的1.1的實現。加載的OpenGL> 1.1功能的Windows

我想要做的是加載較新的OpenGL> 1.1功能,如glBindBufferglBufferData。我讀過使用wglGetProcAddress獲得指向函數的指針。當使用這個函數時,返回的指針總是爲空,所有使用GetProcAddress(OpenGL32DLL, "...")的dll中的原始函數都能很好地工作,除了新函數似乎沒有加載。

我希望這裏的任何人都可以幫助我通過我的設置,並指出我做錯了什麼,或者如果我錯過了什麼。

所以在這裏,我們去:

  • 我已經下載的OpenGL擴展瀏覽器4.4,其指出我能夠完美地高達2.1的OpenGL運行的 應該綽綽有餘使用或負載glBindBufferglBufferData更多。

  • 我下載了Microsoft SDKs/v7.1,其中包含標題:gl/glu.hgl/gl.h;我還從here下載了GLEXT擴展API ,並鏈接了包含頭文件的glext.lib +。

  • 文件中的鏈接:

C:\ Program Files文件\微軟的SDK \的Windows \ V7.1 \ LIB \ OpenGL32.Lib

C:\ Program Files文件\微軟的SDK \的Windows \ V7.1 \ LIB \ GlU32.Lib

C:\用戶\用戶\桌面\ glext \ LIB \ glext.lib

  • 的CPP文件包括:

C:\ Program Files文件\微軟的SDK \的Windows \ V7.1 \包括 - > GL.h,GLU.h

C:\用戶\用戶\桌面\ glext \包括 - > glcorearb.h,glext.h,wglext.h

+0

你有沒有調用'wglGetProcAddress'之前創建OpenGL上下文? – user815923

回答

5

,而不是你自己處理所有這些細節,我建議你只抓住自己GLEW(http://glew.sourceforge.net/)的副本處理所有這是給你一個標準的方式。我目前在幾個已發佈的產品上使用它,沒有問題。

在你的榜樣,你能做到以下幾點:

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

(當然,要glewInit(),可能與glewExperimental = TRUE;通話後 - 見文檔的詳細信息。)

+0

你好,感謝您的評論。我知道這個巨型圖書館,但是我很樂意在沒有它的情況下做到這一點,因爲這只是一個更大項目的一小部分,我想盡可能保持一切儘可能的輕量級。 – MircoProgram

+0

@MircoProgram老實說,這是一個只有頭文件的解決方案,所以在性能,編譯時間或二進制大小方面不會有太大的影響。您將確保您正確地做事,並且添加功能將變得微不足道。 –

+0

@MikeWeir:GLEW是*不是*「僅標題」庫(除非最近有變化)。現在,GLEW也不是一個重量級的組件,所以仍然沒有合法的理由,不會使用它或其他加載庫。 –

0

我認爲問題是在調用wglGetProcAddress時沒有當前上下文。

函數指針可以是特定的精確像素格式,由tge上下文創建過程確定。

1

使用此函數時,返回的指針始終爲空,使用GetProcAddress(OpenGL32DLL,「...」)的dll中的所有原始函數都能正常工作,除非新函數似乎無法加載。

您是否在調用線程上創建了一個有效的OpenGL上下文並使其成爲當前?在Windows中,擴展函數在技術上是根據上下文的,也就是說,您必須獲得指向您創建的每個OpenGL上下文的函數的指針,並確保在正確的上下文中使用正確的函數指針。

這當然也意味着你必須有一個開始的OpenGL上下文。在Windows中設置OpenGL上下文的通常的順序是:

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) 
}