0

RGBビデオフレームをウィンドウにレンダリングする機能があります。これは、ウィンドウが同じサイズの場合、キャプチャされたサイズ(640 x 480)で正常に機能しますが、ウィンドウのサイズを変更すると、レンダリングが正しくありません。

img http://img855.imageshack.us/img855/1694/screenshot20120404at536.png

編集:現在機能している機能。

static inline void draw_rgb(
     unsigned char * buf, unsigned x, unsigned y, unsigned window_width,
     unsigned window_height, unsigned frame_width, unsigned frame_height
 )
{
    glEnable(GL_TEXTURE_RECTANGLE_EXT);
    glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 1);

    glTextureRangeAPPLE(GL_TEXTURE_RECTANGLE_EXT, window_width * window_height * 2, buf);

    glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, frame_width, frame_height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, buf);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);

    glViewport(x, y, window_width, window_height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glOrtho((GLfloat)0, (GLfloat)window_width, (GLfloat)0, (GLfloat)window_height, -1.0, 1.0);

    glBindTexture(GL_TEXTURE_RECTANGLE_EXT, 1);

    glMatrixMode(GL_TEXTURE);
    glLoadIdentity();

    glBegin(GL_QUADS);
    {
        glTexCoord2f(0.0f, 0.0f);
        glVertex2f(0.0f, window_height);
        glTexCoord2f(0.0f, frame_height);
        glVertex2f(0.0f, 0.0f);
        glTexCoord2f(frame_width, frame_height);
        glVertex2f(window_width, 0.0f);
        glTexCoord2f(frame_width, 0.0f);
        glVertex2f(window_width, window_height);
    }
    glEnd();
}
4

3 に答える 3

3

主な問題はここにあります

glTexImage2D(GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, window_width, window_height, 0,
         GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, buf);

glTexImageは、ウィンドウサイズや目的の出力のサイズではなく、テクスチャデータのサイズを取得します。

于 2012-04-05T00:17:48.213 に答える
2

あなたの問題は2つの要因の組み合わせです。

まず、datenwolfが指摘したように、テクスチャの幅/高さは一定です。ウィンドウのサイズが変わっても変わりません。ところで、テクスチャのデータが変更されない限り、フレームごとにテクスチャを再構築するべきではありません。それでも、glTexSubImage2Dではなくを使用して変更をアップロードできますglTexImage。ものを呼び出す必要もありませんglTexParameter

次に、これはテクスチャの座標が変わらないことも意味します。したがって、クワッド描画を次のように変更する必要があります。

glBegin(GL_QUADS);
{
    glTexCoord2f(0.0f, 0.0f);
    glVertex2f(0.0f, window_height);
    glTexCoord2f(0.0f, texture_height);
    glVertex2f(0.0f, 0.0f);
    glTexCoord2f(texture_width, texture_height);
    glVertex2f(window_width, 0.0f);
    glTexCoord2f(texture_width, 0.0f);
    glVertex2f(window_width, window_height);
}
glEnd();
于 2012-04-05T00:40:16.487 に答える
0

あなたのglViewport呼び出しは、他のすべての場所でテクスチャのサイズを表す同じ変数を使用していますwh

およびglViewportの代わりに、レンダリング先のウィンドウのサイズを使用するようにを変更してみてください。他のすべては同じままでいることができるはずです。wh

より良い結果を得るには、ビューポートの幅または高さを減らしてビデオが引き伸ばされていないように見せることで、ビデオのアスペクト比を維持するようにビューポートのサイズを調整できます。

于 2012-04-04T21:55:39.843 に答える