2012-07-03 53 views
2

在OpenGL的OpenGL超級的例子說,我可以通過讀取Windows特定擴展名:如何讀取Windows特定擴展

//Type defined in the book as char, but that is not what glGetString returns... 
const GLubyte *extensions = glGetString(GL_EXTENSIONS); 
if(strstr(extensions, "WGL_EXT_swap_control") != NULL) 
{ 
    wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)wglGetProcAddress("wglSwapIntervalEXT"); 
    if(wglSwapIntervalEXT != NULL) 
     wglSwapIntervalEXT(1); 
} 

strstr不採取GLubyte。如何使這項工作?

+0

只需將'glGetString'的返回值轉換爲'const char *'即可。 – user786653

+0

我嘗試過,並得到「block.exe中的0x77e315de:未處理的異常:0xC0000005:訪問衝突讀取位置0x00000000」。 –

+0

因爲'glGetString'返回一個空指針。我的猜測是你在初始化OpenGL或者從不同的線程中調用它(不太可能)。 – user786653

回答

4

您可以將返回值glGetString轉換爲常量字符指針並使用您最喜歡的字符串處理函數。

但我真的推薦使用庫,例如GLEW,用於管理擴展。

+0

我現在仍在學習基礎知識。最終我會按照你的建議使用一個庫。 –

+0

使用GLEW將使您的生活更輕鬆,並且您不需要學習99%的案例幾乎沒有用的東西。而且,你不會學到他們錯誤的(關於WGL的正確答案就是一首歌)。 – Damon

4

glGetString(GL_EXTENSIONS)將返回視頻卡支持的大多數擴展名(,空格分隔)。但特定窗口WGL_擴展(對於OpenGL版本3.0+)不包含在此調用中。您還需要致電wglGetExtensionsString(HDC)以獲取該卡支持的其他WGL擴展。

下面是一個代碼段(您可能除去ARB後綴):

#include <windows.h> 
#include <iostream> 
#include <GL/gl.h> 

// function ptr: WGL specific extensions for v3.0+ 
typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC hdc); 
PFNWGLGETEXTENSIONSSTRINGARBPROC pwglGetExtensionsStringARB = 0; 
#define wglGetExtensionsStringARB pwglGetExtensionsStringARB 
... 

// get WGL specific extensions for v3.0+ 
wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)wglGetProcAddress("wglGetExtensionsStringARB"); 
if(wglGetExtensionsStringARB) 
{ 
    const char* str = wglGetExtensionsStringARB(hdc); 
    if(str) 
    { 
     std::cout << str << std::endl; 
    } 
} 

注意wglGetExtensionsString()需要HDC(句柄設備上下文)當前窗口顯示作爲參數。你可以從窗口句柄中獲得HDC(HWND);

HDC hdc = ::GetDC(hwnd);