Некоторое время назад я начал работать с рендерером OpenGL (3.3) для программы MFC. Все было хорошо, пока я не решил запустить некоторые средства отладки OpenGL, чтобы посмотреть, есть ли у меня какие-то тихие ошибки. Я использовал
gDEBugger .Running инструмент анализа программ gDebug Я сразу начал получать ошибки следующего типа:
Строка отладки: Обнаружена ошибка: отлаженный процесс запросил указатель функции расширения (glGenBuffers) из одного контекста рендеринга, но вызвал этот указатель функции в другом контексте рендеринга (context # 2)
Фактически каждый метод GLEW получает эту ошибку. Теперь я начал искать проблему на форумах, а также в MSDN, и обнаружил, что некоторые люди упоминают, что в среде Windows необходимо переопределить некоторые указатели методов GLEW. Также я наткнулся на этот урок , который показывает, как красиво каждый метод GLEW переопределяется с помощью методов Windows OpenGL, подобных этим:
void CGLRenderer::InitAPI()
{
// Program
glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");
glDeleteProgram = (PFNGLDELETEPROGRAMPROC)wglGetProcAddress("glDeleteProgram");
glUseProgram = (PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram");
...
....
Моя настройка контекста OpenGL выглядит следующим образом:
bool OpenGLMain::create30Context(HDC device_context){
//this->hwnd=hwnd;
hdc=device_context;//GetDC(hwnd);
hdcGlobal=&hdc;
PIXELFORMATDESCRIPTOR kPFD;
memset(&kPFD,0,sizeof(PIXELFORMATDESCRIPTOR));
kPFD.nSize=sizeof(PIXELFORMATDESCRIPTOR);
kPFD.nVersion=1;
kPFD.dwFlags=
PFD_DRAW_TO_WINDOW|
PFD_SUPPORT_OPENGL|
PFD_GENERIC_ACCELERATED|
PFD_DOUBLEBUFFER;
kPFD.iPixelType=PFD_TYPE_RGBA;
kPFD.cColorBits=32;
kPFD.cDepthBits=32;
kPFD.cStencilBits=8;
kPFD.iLayerType=PFD_MAIN_PLANE;
int iPixelFormat=ChoosePixelFormat(hdc,&kPFD);
if(iPixelFormat==0){
// ReleaseDC(window,gs_hWindowDC);
return false;
}
BOOL bSuccess=SetPixelFormat(hdc,iPixelFormat,&kPFD);
if(!bSuccess){
// ReleaseDC(window,gs_hWindowDC);
return false;
}
/////////init opengl context
HGLRC tempOpenGLContext=wglCreateContext(hdc);/////Openggl 2.1
wglMakeCurrent(hdc,tempOpenGLContext);////male openGL 2.1 context current and active
GLenum error =glewInit();
if(error!=GLEW_OK){
return false;
}
/////////context setup///////
int attributes[]={
WGL_CONTEXT_MAJOR_VERSION_ARB,3,
WGL_CONTEXT_MINOR_VERSION_ARB,2,
WGL_CONTEXT_FLAGS_ARB,WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,0
};
if(wglewIsSupported("WGL_ARB_create_context")==1){
hrc=wglCreateContextAttribsARB(hdc,NULL,attributes);///create OpenGL 3x context based on the supplied attributes
wglMakeCurrent(NULL,NULL);//remove temp context
wglDeleteContext(tempOpenGLContext);
wglMakeCurrent(hdc,hrc);
}else{
hrc=tempOpenGLContext;////if no support for OGL 3x detected roll back to 2.0
}
/////////version check///////////////
int glVersion[2]={-1,-1};
glGetIntegerv(GL_MAJOR_VERSION,&glVersion[0]);
glGetIntegerv(GL_MINOR_VERSION,&glVersion[1]);
std::cout<<"Using openGL"<<glVersion[0]<<"."<<glVersion[1]<<
std::endl;
OutputDebugString(L"Using OPENGL version:"+glVersion[0]);
return true;
}
Теперь я действительно запутался в этом моменте, потому что на самом деле программа работает нормально внутри VisualStudio без переопределения всех этих методов GLEW. Но он показывает пустой экран (без геометрии), если я запускаю исполняемый файл напрямую. Также во всех других примерах и учебники, которые я когда-либо читал, никогда не упоминалось, что нужно сбрасывать указатели на методы API GLEW. Поэтому мой вопрос: может ли кто-нибудь указать на правильный путь интеграции OpenGL 3.3 в Windows API, потому что кажется, что есть много способов Делать это.