如何阅读特定于窗口的扩展

How to read windows specific extensions

本文关键字:窗口 扩展 何阅读 于窗口      更新时间:2023-10-16

在OpenGL超级圣经中,示例说我可以通过以下方式读取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. 如何做到这一点?

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

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

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(设备上下文句柄)作为参数。 您可以从窗口句柄 (HWND) 获取 HDC;

HDC hdc = ::GetDC(hwnd);