wglGetProcAddress 返回空指针。

6

我尝试使用WGL_ARB_pbuffer来实现OpenGL的离屏渲染,

wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) wglGetProcAddress("wglGetExtensionsStringARB");
if(!wglGetExtensionsStringARB) return;
const GLubyte* extensions = (const GLubyte*) wglGetExtensionsStringARB(wglGetCurrentDC());

实际上,这个在第二行结束,因为wglGetExtensionsStringARB得到了NULL。
PFNWGLGETEXTENSIONSSTRINGARBPROC    pwglGetExtensionsStringARB = 0;
#define wglGetExtensionsStringARB   pwglGetExtensionsStringARB


你确定该函数被你的驱动程序/显卡组合支持吗?ARB表示这是一个不一定在所有硬件上都支持的函数。引用自https://www.opengl.org/registry/specs/ARB/wgl_extensions_string.txt - “应用程序应调用wglGetProcAddress来查看是否支持wglGetExtensionsStringARB。如果支持,则可以使用它来确定设备支持哪些WGL扩展。” - enhzflep
这就是为什么我写了__“if(!wglGetExtensionsStringARB) return;”__,所以它会返回,但我仍然不知道为什么wglGetExtensionsStringARB为空。如果我必须检查我的驱动程序,我该怎么做? - phraust
正如@enhzflep所提到的,NULL表示您的驱动程序/GL实现不支持此扩展。如果您有一个具备此支持的软件实现,您可以使用它,否则您需要升级您的驱动程序/硬件。除非您打算自己实现此扩展,否则检查驱动程序时能做的事情很少。 - Prabindh
@phraust - 如果 wglGetProcAddress 调用返回 NULL,意味着它不受支持 - 这是您检查卡/驱动程序支持的方法。看起来您没有它。 :( 是否尝试过 wglGetExtensionString,就像这里回答中提到的那样:http://stackoverflow.com/questions/11315053/how-to-read-windows-specific-extensions? - enhzflep
2
其他(非WGL和WGL扩展)是否工作?您是否有当前的GL上下文? - starmole
1个回答

16

wglGetProcAddress 需要一个OpenGL渲染上下文;在调用wglGetProcAddress之前,您需要调用wglCreateContextwglMakeCurrent。如果您还没有设置OpenGL上下文,wglGetProcAddress将始终返回NULL。如果您不确定是否已经拥有了OpenGL上下文(例如,如果您正在使用第三方框架/库),请调用wglGetCurrentContext并检查它是否返回NULL


哦,原来这就是为什么glewInit在glutCreateWindow之后被调用。但仍然无法解释为什么glLoadMatrixf/glGetFloatv(GL_MODELVIEW_MATRIX,Out)也需要它(如果上下文未设置,则不会崩溃但不起作用)... - Dmytro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接