2011-01-31 7 views
4

私はopenCV全画面から画像を描画していますが、これは60fpsの大きな画像ですので、openCV GUIよりも速い方法が必要でした。それらをスケーリングするOpenGLハードウェアを使用して - 側:私はOpenGLの使用glTexImage2D複数画像

void paintGL() { 
    glClear (GL_COLOR_BUFFER_BIT); 
    glClearColor (0.0,0.0,0.0,1.0); 

    glDisable(GL_DEPTH_TEST); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0,width,height,0); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glEnable(GL_TEXTURE_2D); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data); 
    glBegin(GL_QUADS); 
    glTexCoord2i(0,0); glVertex2i(0,height); 
    glTexCoord2i(0,1); glVertex2i(0,0); 
    glTexCoord2i(1,1); glVertex2i(width,0); 
    glTexCoord2i(1,0); glVertex2i(width,height); 
    glEnd(); 
    glDisable(GL_TEXTURE_2D); 
} 

は今、私は2枚の画像の側を描きたいです。
クワッドサイズを変更してイメージを縮小できますglTexImage2()で2つのイメージをロードする方法を理解できません。イメージにハンドルまたはIDが関連付けられていないためです。

答えて

11

他のテクスチャを追加する方法がわからないのは、投稿したコードに2つの重要な機能、つまりglGenTexturesglBindTextureがないためです。最初は、OpenGLコンテキスト(テクスチャがグラフィックハードウェアに存在する場所)でテクスチャオブジェクトを生成します。 2番目のテクスチャオブジェクトは、その後の呼び出し(glTex ..)に影響を与えるテクスチャオブジェクトの1つを「選択」します。

まず、glTexParameteriやglTexImage2Dのような関数は、すべてのレンダリングループで再度呼び出す必要はありませんが、あなたのケースでは、イメージは常に変化しているため、そうする必要があります。デフォルトでは、コードでは、使用されるテクスチャオブジェクトは0番目のオブジェクトです(デフォルトの場合は予約されています)。あなたは、2つのテクスチャオブジェクトを作成し、望ましい結果を達成するためにそれらを次々にバインドする必要があります。

GLuint tex_obj[2]; //create two names for the texture (should not be global variables, but just for sake of this example). 

void initGL() { 
    glClearColor (0.0,0.0,0.0,1.0); 

    glDisable(GL_DEPTH_TEST); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0,width,height,0); 

    glEnable(GL_TEXTURE_2D); 
    glGenTextures(2,tex_obj); //generate 2 texture objects with names tex_obj[0] and [1] 

    glBindTexture(GL_TEXTURE_2D, tex_obj[0]); //bind the first texture 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //set its parameters 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

    glBindTexture(GL_TEXTURE_2D, tex_obj[1]); //bind the second texture 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //set its parameters 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
} 

void paintGL() { 
    glClear (GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glBindTexture(GL_TEXTURE_2D,tex_obj[0]); //bind the first texture. 
    //then load it into the graphics hardware: 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width0, height0, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data0); 
    glBegin(GL_QUADS); 
    glTexCoord2i(0,0); glVertex2i(0,height); //you should probably change these vertices. 
    glTexCoord2i(0,1); glVertex2i(0,0); 
    glTexCoord2i(1,1); glVertex2i(width,0); 
    glTexCoord2i(1,0); glVertex2i(width,height); 
    glEnd(); 

    glBindTexture(GL_TEXTURE_2D, tex_obj[1]); //bind the second texture. 
    //then load it into the graphics hardware: 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width1, height1, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data1); 
    glBegin(GL_QUADS); 
    glTexCoord2i(0,0); glVertex2i(0,height); //you should probably change these vertices. 
    glTexCoord2i(0,1); glVertex2i(0,0); 
    glTexCoord2i(1,1); glVertex2i(width,0); 
    glTexCoord2i(1,0); glVertex2i(width,height); 
    glEnd(); 
} 

、それがどのように行われるか、基本的です。しかし、私はOpenGLの知識が少し古くなっているので、これを行うより効率的な方法があるかもしれないと警告しなければなりません(少なくともglBegin/glEndはC++では廃止され、VBOでは置き換えられています。

+0

動作しないでそれを思い出して - 私はgluOrtho2D(0、幅、高さ、0)を行う必要があります。すべてのペイントで何も表示されません - それはまだglTexImage2D()のどちらかを塗ります。特定のglTexImage2D()にテクスチャIDを関連付けるものは何ですか? [OK]を –

+0

私は馬鹿だ - 、私が間違っている第二の画像のためのクワッド(!開始および終了幅が同じであった)だったが、私はまだテクスチャが作成されると、すべてのコール –

+2

にgluOrtho2D(フルウィンドウCOORDS)を行う必要がありますglTexSubImage2Dを使用してデータを更新するだけです。毎回フル再初期化を行うglTexImageよりもはるかに高速です。実際には、glTexImageのデータパラメータにNULLを渡して、あとでglTexSubImageを使ってデータを初期化してから供給することだけを伝えることができます – datenwolf

2

OpenGLは状態マシンです - あなたはそれを状態にし、コマンドを与え、後で状態を再生します。テクスチャについて

一つの良いところは、あなたがペイントコール外のことを行うことができるということです - ので、あなたは画像1を生成して画像処理ステップであれば、あなたはその時点でカードにロードすることができます。

glBindTexture(GL_TEXTURE_2D,tex_obj[1]); // select image 1 slot 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width1, height1, 0, GL_RGB, GL_UNSIGNED_BYTE, the_image_data1); // load it into the graphics card memory 

そしてペイントコール

glBindTexture(GL_TEXTURE_2D,tex_obj[1]); // select pre loaded image 1 
glBegin(GL_QUADS); // draw it 
関連する問題