2011-06-17 11 views
1

ここでは非常に簡単なコードです。詳細なデバッグのために同じコードを何度も繰り返しています。詳細情報:OpenGLバージョン3.3.0、Window 7 OSおよびVS2008、OpenCV 2.2.0。OpenCV 2.2のウィンドウでOpenGLの問題が発生する

RenderObject(); 
//glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); 
Mat image; 
image.create(screenHeight,screenWidth, CV_8UC3); 
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR, GL_UNSIGNED_BYTE, (uchar*)image.data); 
int error_code1 = glGetError(); // Error Code: 0, NO Error, Also output is good/as expected! 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); 
int error_code8 = glGetError(); // Error Code: 0, NO Error 
//flip(image, image, 0); 
//glPopClientAttrib(); 
const char *title = "glReadPixels Output"; 
cv::namedWindow(title); 
int error_code2 = glGetError(); // Error Code: 1282, GL_INVALID_OPERATION 
imshow(title, image); 
int error_code3 = glGetError(); // Error Code: 1282, GL_INVALID_OPERATION 
waitKey(5000); 
int error_code4 = glGetError(); // Error Code: 0, NO Error 
destroyWindow(title); 
int error_code5 = glGetError(); // Error Code: 1282, GL_INVALID_OPERATION 
image.release(); 

int error_code6 = glGetError(); // Error Code: 1282, GL_INVALID_OPERATION 

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId); 
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); 
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); 

int error_code7 = glGetError(); // Error Code: 1282, GL_INVALID_OPERATION 

ここで何かが起こっています。それは何ですか? ...少なくともOpenCVウィンドウがデフォルトのバッファーを引き継いでいてもerror_code7は0(つまりエラーなし)でなければなりません。私はframebufferオブジェクトとデフォルトのglut hiddenウィンドウを使ってコードをテストしました。私の目的のためにフレームバッファオブジェクトを使用しなければならないことも教えてください。したがって、描画と表示に同じデフォルトのウィンドウを使用することはできません。

答えて

0

「WITH_QT_OPENGL」を使用してOpenCVをビルドした場合、上記の問題が発生します。

ソリューション: 'WITH_QT_OPENGL' オプションなし

  1. ビルドOpenCVの。すべてのエラーを完全に削除します。
  2. ドローバッファー(つまり、デフォルトのバッファーオブジェクトまたはFBOとFBOとテクスチャー/レンダーバッファーの両方でglDrawBufferを再接続する場合は、 'glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);'を使用して有効にできます)
0

code4は、以前のglGetError()の後に新しいOpenGL操作が発生しなかったため、0です。 glGetError()のゼロ以外の戻り値が最初に出現した時点で問題が修正されるはずです。したがって、todoリストの最初のものは、以下にglGetError()を追加することです。 glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

この行は本当に問題を引き起こすべきではありませんが、それでも確認してください。もしそうでなければ、おそらくnamedWindowの呼び出しがうまくいきません。あなたのOpenGLコンテキストはどのバージョンですか?

+0

OpenGLバージョン3.3.0、ウィンドウ7 OS、VS2008。また、 'glBindFramebufferEXT(GL_FRAMEBUFFER_EXT、0);の後に' glGetError() 'をチェックしましたが、エラーはありません。それに応じて質問も更新しました。ありがとう。最終的には問題の根源となる解決策がいくつかあります。 – Rudi

+0

ありがとう! – Rudi

関連する問題