Я пытаюсь записать код из этого руководство. У меня есть код InitializeOGL ():
bool Ogl::InitializeOGL(bool vSync)
{
cout<<"Init OpenGL"<<endl;
int pixelFormat;
PIXELFORMATDESCRIPTOR pixelFormatDescriptor;
int result;
char *vendorChar, *rendererChar;
hDC = GetDC(hWnd);
if(!hDC)
return false;
pixelFormat = ChoosePixelFormat(hDC,&pixelFormatDescriptor);
if(pixelFormat==0)
return false;
result = SetPixelFormat(hDC,pixelFormat,&pixelFormatDescriptor);
if(result!=1)
return false;
HGLRC tempDeviceContext = wglCreateContext(hDC);
wglMakeCurrent(hDC,tempDeviceContext);
// glewExperimental = GL_TRUE;
if(glewInit()!=GLEW_OK)
return false;
int attribList[5] =
{
WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
WGL_CONTEXT_MINOR_VERSION_ARB, 1, 0
};
hGLRC = wglCreateContextAttribsARB(hDC,0,attribList);
if(hGLRC!=NULL)
{
wglMakeCurrent(NULL,NULL);
wglDeleteContext(tempDeviceContext);
result = wglMakeCurrent(hDC,hGLRC);
if(result!=1)
return false;
}
vendorChar = (char*)glGetString(GL_VENDOR);
rendererChar = (char*)glGetString(GL_RENDERER);
strcpy_s(videoCardInfo,vendorChar);
strcat_s(videoCardInfo,"-");
strcat_s(videoCardInfo,rendererChar);
if(vSync)
result = wglSwapIntervalEXT(1);
else
result = wglSwapIntervalEXT(0);
if(result!=1)
return false;
int glVersion[2] = {-1,-1};
glGetIntegerv(GL_MAJOR_VERSION,&glVersion[0]);
glGetIntegerv(GL_MINOR_VERSION,&glVersion[1]);
cout<<"Initializing OpenGL"<<endl;
cout<<"OpenGL version"<<glVersion[0]<<"."<<glVersion[1]<<endl;
cout<<"GPU"<<videoCardInfo<<endl;
return 0;
}
Когда я пытаюсь изменить версию контекста на OpenGL 3.1, здесь вылетает wglCreateContextAttribsARB ()
функция (указатель для этого получает в LoadExtensions () правильно). При попытке создать OpenGL 4.0 здесь вылетает функция wglSwapIntervalEXT (). Моя графическая карта поддерживает только OpenGL 3.1.
Мой вопрос заключается в том, как успешно инициировать контекст OpenGL здесь? Что мне нужно сделать, чтобы создать контекст OpenGL в версии 3.1.
Есть несколько вещей, которые необходимо упомянуть здесь:
Если ваша видеокарта / драйвер поддерживает только OpenGL 3.1, то WGL_CONTEXT_MAJOR_VERSION_ARB
и друзья, как правило, будут неопределенными. До того, как OpenGL 3.2 представил ядро / совместимость, контекстные версии не имели особого смысла.
WGL_ARB_create_context
или же WGL_ARB_create_conext_profile
,ChoosePixelFormat
а также SetPixelFormat
PIXELFORMATDESCRIPTOR pixelFormatDescriptor; // <--- Uninitialized
Как минимум, Win32 API требует, чтобы вы инициализировали поле размера этой структуры. В прошлые годы размер структур использовался для определения версии Windows, для которой был написан определенный фрагмент кода. В наши дни такие структуры, как PIXELFORMATDESCRIPTOR
как правило, статические по размеру, потому что они используются частью Windows, которая устарела (GDI), но если вы не установите размер, вы все равно можете полностью запутать Windows. Кроме того, вам необходимо пометить формат пикселя для поддержки OpenGL, чтобы гарантировать его использование для создания контекста рендеринга OpenGL.
Также обратите внимание, что после установки формата пикселя для контекста устройства в Windows его нельзя изменить. Как правило, это означает, что если вы хотите создать фиктивный контекст рендеринга для инициализации ваших расширений, вы также должны создать фиктивное окно с фиктивным пиксельным форматом. После Вы инициализируете свои расширения, вы можете использовать wglChoosePixelFormatARB (...)
и связанные с ним функции, чтобы выбрать формат пикселя для контекста устройства вашего главного окна.
Это (было) особенно важно в те дни, когда еще не было FBO, когда вы хотели внедрить мультисэмплинг. Вы не можете получить формат пикселя с несколькими образцами, используя ChoosePixelFormat (...)
, но вам нужно позвонить ChoosePixelFormat (...)
чтобы установить расширение, необходимое для получения пиксельного формата с несколькими образцами. Вид улова 22.
Других решений пока нет …