wglCreateContextAttribsARB在有能力的硬件上返回NULL

时间:2014-07-14 21:13:52

标签: c++ windows opengl glew wgl

我有一个程序可以在Windows机器上创建OpenGL 4.0上下文。在我自己的计算机上,此代码可以正常工作 - 但是,在我朋友的计算机上,它没有。 wglCreateContextAttribsARB返回NULL,即使我朋友的Nvidia卡支持OpenGL 4.4,并且应该能够返回向后兼容的上下文。每个其他电话都按预期进行。

这是上下文创建代码:

dc = GetDC(window::get());

PIXELFORMATDESCRIPTOR pfd = { 0 };
pfd.nSize = sizeof(pfd);
pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 32;

int nPixelFormat = ChoosePixelFormat(dc, &pfd);
SetPixelFormat(dc, nPixelFormat, &pfd);
HGLRC tempRC = wglCreateContext(dc);
wglMakeCurrent(dc, tempRC);
glewInit();

static const int attributes[] = {
    WGL_CONTEXT_MAJOR_VERSION_ARB, 4,
    WGL_CONTEXT_MINOR_VERSION_ARB, 0,
    NULL
};

rc = wglCreateContextAttribsARB(dc, NULL, attributes);

if (rc == NULL) {
    abort();
}

wglMakeCurrent(NULL, NULL);
wglDeleteContext(tempRC);
wglMakeCurrent(dc, rc);

glClearColor(0.2, 0.4, 0.6, 1.0);
glEnable(GL_DEPTH_TEST);
wglSwapIntervalEXT(1);

另一个人遇到了类似的问题并发布了this question here。然而,解决问题的方法并不是解决我的问题。我完全难过了。

1 个答案:

答案 0 :(得分:3)

检查基本上下文的供应商字符串。还要检查其他OpenGL程序是否正常运行。

有一些东西可以完全禁用图形加速,主要与镜像驱动程序(远程桌面,屏幕录制等)有关。

此外,一些笔记本电脑同时集成了Intel 1 图形(iGPU)和分立的nVidia或AMD图形(dGPU)。在驱动程序检测到游戏或基准测试运行之前,dGPU将关闭以延长电池寿命。

在C或C ++中,对于nVidia,有一种相对简单的方法来为您的应用程序请求dGPU:

extern "C" { _declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001; }

不幸的是people are still searching for ways to do this for other hybrids, like AMD


1 AMD也使用iGPU制造处理器,但它们的功能更加完善(如果速度很慢),如果还存在dGPU,它们会以不平衡的CrossFire形式协同工作。因此,我假设在这种情况下不需要明确启用dGPU。如果您有AMD APU(组合CPU + iGPU)和nVidia dGPU,我不知道会发生什么。