MFCプログラム用のOpenGL(3.3)レンダラで作業を開始しました。いくつかのOpenGLデバッグツールを実行して静かなエラーがあるかどうかを確認するまではすべて正常でした。 私はすぐに次のタイプのエラーを取得開始gDEBugger .Running gDebugプログラム解析ツール:Windows APIでOpenGL拡張ポインタをリセットする
デバッグ文字列:検出されたエラー:デバッグプロセスコンテキストをレンダリングする1から拡張関数ポインタ(glGenBuffers)を求めたが、この関数ポインタと呼ばれます別のレンダーコンテキスト(コンテキスト#2)で
実際にはすべてのGLEWメソッドがこのエラーを取得しました。私はフォーラムやMSDNの問題を探し始めました。Windows環境でいくつかのGLEWメソッドポインタを再定義する必要があると言われました。また、私はつまずいたthis tutorialどのGLEWメソッドこれらのようなWindowsのOpenGLの方法を使用して再定義されています
void CGLRenderer::InitAPI()
{
// Program
glCreateProgram = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");
glDeleteProgram = (PFNGLDELETEPROGRAMPROC)wglGetProcAddress("glDeleteProgram");
glUseProgram = (PFNGLUSEPROGRAMPROC)wglGetProcAddress("glUseProgram");
...
....
私のOpenGLコンテキストのセットアップは、次のようになります。実際にはプログラムが細かい内部のVisualStudioを実行するため
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;
}
今私は、この時点では本当に混乱していますこれらのGLEWメソッドをすべて再定義する必要はありません。しかし、空のスクリーン(ジオメトリなし)私は実行可能ファイルを直接実行します。他のすべての例とチュートリアルでは、これまで読んだことのないGLEW APIメソッドのポインタをリセットする必要があります。私の質問は、誰かがOpenGLを統合する正しい方法を指摘できるかどうかです3.3をWindows APIで使用する方法はたくさんあるようだからです。
2番目のコンテキストを作成して現在の状態にしてから、もう一度glewInitを呼び出してみてください。 –
これは素晴らしいヒントでしたが、エラーはかなり少なくなっています。実際は2つです:glGenVertexArraysとglBindVertexArra –
何らかの理由で、 'glewInit'を呼び出す前に' glewExperimental'をtrueに設定すると、gDEBuggerは関数ポインタは異なるコンテキストからのものです。私は新しいコンテキストのために 'glewInit'をもう一度呼び出す必要はありません。私はこれが異なるシステム間で一貫して動作するかどうかは分かりませんが、確かに試してみる価値があります! – fintelia