wglCreateContextAttribsARB возвращает NULL на совместимом оборудовании

У меня есть программа, которая создает контекст OpenGL 4.0 на компьютере с Windows. На моем собственном компьютере этот код работает, однако на компьютере моего друга — нет. 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);

У другого человека была похожая проблема, и он написал этот вопрос здесь. Однако то, что решило проблему для них, не решает проблему для меня. Я полностью в тупике.

2

Решение

Проверьте строку поставщика вашего основного контекста. Также проверьте, правильно ли работают другие программы OpenGL.

Есть несколько вещей, которые могут полностью отключить использование графического ускорения, в основном связанные с драйверами зеркал (удаленный рабочий стол, запись экрана и т. Д.).

Кроме того, некоторые ноутбуки имеют встроенный Intel1 графика (iGPU) и дискретная графика nVidia или AMD (dGPU). Пока драйвер не обнаружит игру или тест производительности, dGPU будет отключен, чтобы продлить срок службы батареи.

В C или C ++ для nVidia есть относительно простой способ запросить dGPU для вашего приложения:

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

к несчастью люди все еще ищут способы сделать это для других гибридов, таких как AMD.


1 AMD также делает процессоры с iGPU, но их возможности более полные (если они медленные), и, если присутствует также dGPU, они работают вместе в виде несбалансированного CrossFire. Поэтому я предполагаю, что явное включение dGPU в таких случаях не требуется. Если у вас есть AMD APU (комбинированный процессор + iGPU) и nVidia dGPU, я понятия не имею, что произойдет.

3

Другие решения


По вопросам рекламы [email protected]