人気ブログランキング | 話題のタグを見る
OpenGLの背景に画像(動画)を入れる ~ glDrawPixelsを使用
ここのところ、まともなネタが無くて、気力も無くて困っています。

やっとネタが出来ました。
OpenGLです。
このブログでは初めてのOpenGLです。

画像を3Dグラフィックの画面に重ねて(というか背景にして)描画したいのですが、チョロいと思って始めたのに、丸1日もかかってしまいました。
3Dグラフィックプログラムで難しいところは、自分の頭の中ではこうすれば出来るはずと思っていることが、出来ない。しかも、それが「画面に何も表示されない」とか、「変化がない」という症状で現れる。
デバッガでもOpenGLライブラリやGPUの中で何が起こっているのかは分からない。
しかも、DLLの中でのコーディングだと、余計にデバッグが面倒くさいし。

そんなわけで、苦労の結晶がコレです。

何をしたいかというと、OpenGLの3D描画の裏側に動画を入れたいのです。
テクスチャに貼って、、、という方法も有りますが、面倒だったので、バックバッファに直接描画する方法を検討しました。

で、glDrawPixels というOpenGLの関数で出来るところまでは来ました。
Webで検索したりして作成したテストプログラムでは、完璧に動作しますが、いざ実際のプログラムに組み込むと、なかなかうまくいきません。

この部分だけでは有りませんが、丸1日悩んで、やっと解決策を発見しました。
glDrawPixels は、PROJECTIONマトリクスを初期化しないと、うまく画面座標に合わないみたいです。

次のようにしてみたところ、画面に表示されました!(わ~い)

    // glDrawPixels をコールするときには、PROJECTIONマトリックスを
    // 初期化しないと画面に表示されない。(普通の画面の場合)
    // その後、DEPTHバッファをクリアすれば、画像を背景に
    // OpenGLでレンダリングが出来る
    GLint oldMatrixMode;
    glGetIntegerv(GL_MATRIX_MODE, &oldMatrixMode);
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
        glLoadIdentity();
        glRasterPos2i(-1 , -1);
        glPixelZoom(1,1);
        glDrawPixels(width , height , GL_BGR_EXT , GL_UNSIGNED_BYTE , pBits);
    glPopMatrix();
    glMatrixMode(oldMatrixMode);
    glClear(GL_DEPTH_BUFFER_BIT);    // コレをしないと、画像が背景にならない


ちなみに、GL_BGR_EXT はWindows依存です。
Windowsの24ビットカラービットマップ(DIB)形式のデータを直接(R<->Bスワップ・上下反転なしで)描画出来ます。
ソニーストア

by isoq | 2006-11-12 01:59 | 3Dグラフィックス
<< Windowsのログオフが遅い... Paris! >>