Сброс указателей расширения OpenGL в Windows API - PullRequest
3 голосов
/ 12 марта 2012

Некоторое время назад я начал работать с рендерером 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, потому что кажется, что есть много способов Делать это.

1 Ответ

4 голосов
/ 12 марта 2012

Указатели функций, которые вы получаете, основаны на текущем контексте .То есть для вас вполне возможно получить разные указатели функций для разных контекстов OpenGL.gDEBugger сообщает вам, что обнаружил, что вы используете указатели на функции с контекстом, отличным от того, который использовался для их получения.Что не гарантированно сработает.

При этом, как правило, это будет работать.Это не будет работать, если два контекста не принадлежат одному поставщику (и, вероятно, для одного и того же GPU или SLI / CrossFire GPU).Но если это так, все должно быть в порядке.

GLEW, насколько я понимаю, не может приспособиться к двум различным контекстам, в которых не используют одни и те же указатели на функции.Вам придется звонить glewInit каждый раз, когда вы меняете контексты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...