2

在 OpenGL superbible 中,示例说我可以通过以下方式读取 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。如何使这项工作?

4

2 回答 2

4

您可以将返回值glGetString转换为 const char 指针并使用您最喜欢的字符串处理函数。

但实际上我建议使用库,例如​​ GLEW来管理扩展。

于 2012-07-03T16:43:37.540 回答
4

glGetString(GL_EXTENSIONS)将返回视频卡支持的大多数扩展名(以空格分隔)。但此调用不包含特定于 Windows 的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(Handle to Device Context)作为参数。您可以从窗口句柄 (HWND) 中获取 HDC;

HDC hdc = ::GetDC(hwnd);
于 2012-07-04T13:54:00.940 回答