我有以下代码片段,它创建一个OpenGL上下文,获取指向wglCreateContextAttribsARB的函数指针,然后继续做其他事情:
WNDCLASSEX wc;
auto windowClassName = "WindowClassName";
//Step 1: Registering the Window Class
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = ::DefWindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = nullptr;
wc.hIcon = ::LoadIcon(nullptr, IDI_APPLICATION);
wc.hCursor = ::LoadCursor(nullptr, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = nullptr;
wc.lpszClassName = windowClassName;
wc.hIconSm = ::LoadIcon(nullptr, IDI_APPLICATION);
::RegisterClassEx(&wc);
// Step 2: Creating the Window
auto hWnd = ::CreateWindowEx(WS_EX_CLIENTEDGE,
windowClassName,
"Disposable window to get function pointer",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
nullptr, nullptr, nullptr, nullptr);
PIXELFORMATDESCRIPTOR pfd;
int iFormat;
// Get the device context (DC)
auto hDC = ::GetDC(hWnd);
// Set the pixel format for the DC
::ZeroMemory(&pfd, sizeof(pfd));
pfd.nSize = sizeof(pfd);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24;
pfd.cDepthBits = 16;
pfd.iLayerType = PFD_MAIN_PLANE;
iFormat = ::ChoosePixelFormat(hDC, &pfd);
::SetPixelFormat(hDC, iFormat, &pfd);
// Create and enable the render context (RC)
auto hRC = ::wglCreateContext(hDC);
::wglMakeCurrent(hDC, hRC);
PROC wglCreateContextAttribsARBPtr =
::wglGetProcAddress("wglCreateContextAttribsARB");
ASSERT(wglCreateContextAttribsARBPtr);
如果我将此代码放在单个C ++文件中的main()函数中,使用vs2010编译它,并在目标环境中运行它,一切正常。 wglCreateContextAttribsARBPtr用函数指针填充,稍后使用该函数指针创建一个核心OpenGL 3.3的上下文。
如果我将这个完全相同的代码(字面上复制/粘贴)放入一个巨大的现有代码库(以任何其他OpenGL调用之前运行的方式),使用相同的编译器,相同的编译器标志,并运行它在相同的环境中,wglCreateContextAttribsARBPtr保留为null。
谷歌搜索告诉我这可能是由于一个糟糕的SetPixelFormat调用引起的,所以我试过考虑这个函数的变化量,包括迭代所有有效的像素格式,但无济于事。
但是,完全相同的代码在完全相同的环境中工作 - 所以我不知道可能出现什么问题。
非常感谢获取wglCreateContextAttribsARBPtr的任何帮助。
答案 0 :(得分:0)
如果您为代理窗口获取的OpenGL上下文实际上正在使用GPU驱动程序,则您的代码无法测试。在报告“GDI GENERIC”时,您的程序会使用软件后备光栅器,它不支持所有花哨的东西。你看到这个的最可能的原因是,你要求你的GPU不支持像素格式。
建议:首先查询屏幕颜色深度(请参阅http://blogs.msdn.com/b/oldnewthing/archive/2010/10/13/10075056.aspx)并使用以此方式获得的值来设置PIXELFORMATDESCRIPTOR中的相应值。
同样使用DescribePixelFormat
,您可以枚举所有可能的像素格式,并查找设置了PFD_GENERIC_FORMAT
标志不的格式。
如果我把这个完全相同的代码(字面上复制/粘贴)放入一个巨大的现有代码库中(以这种方式在任何其他OpenGL调用之前运行)
您如何确保没有进行其他OpenGL / wgl调用?