C++ 如何读取特定于windows的扩展
在OpenGL superbible中,示例说明我可以通过以下方式读取Windows特定扩展:C++ 如何读取特定于windows的扩展,c++,opengl,C++,Opengl,在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) { wglSw
//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
的返回值强制转换为常量字符指针,并使用您最喜欢的字符串处理函数
但实际上,我建议使用库,例如用于管理扩展。glGetString(GL_扩展)
将返回视频卡支持的大多数扩展(以空格分隔)。但是,此调用不包括windows特定的WGL\uuz扩展(适用于OpenGL 3.0+版)。您还需要调用wglGetExtensionsString(HDC)
,以获得该卡支持的其余WGL扩展
下面是一段代码片段(您可以删除ARB后缀):
只需将
glGetString
的返回值强制转换为const char*
。我尝试了这一操作,得到了“block.exe中0x77e315de处未处理的异常:0xC0000005:访问冲突读取位置0x00000000。”因为glGetString
返回了空指针。我猜你是在初始化OpenGL之前或从其他线程调用它(不太可能)。@user786653-你是对的。这解决了问题。你应该把答案贴出来,这样我就可以给你评分了。我现在还在学习基础知识。最终,我会按照你的建议使用一个图书馆。使用GLEW会让你的生活更轻松,而且你不需要学习在99%的情况下没有什么用处的东西。而且,您不会错误地学习它们(关于WGL的正确答案是song提供的答案)。
#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;
}
}
HDC hdc = ::GetDC(hwnd);