2

glDrawPixels() を glRasterPos2*() および glPixelZoom() と組み合わせて使用​​すると、非常に奇妙な結果が得られます。私は写真を持っていて、古いフレームバッファのように、つまり (0,0) が左上隅にあるように表示したいと思います。コードは次のとおりです。

void GLWidget::resizeGL( int w, int h )
{
    glViewport( 0, 0, w, h );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho( 0, w, 0, h, -1, 1 );
}

void GLWidget::paintGL()
{
    for( int i = 0; i < SCREEN_WIDTH; ++i )
    {
        displayBitmap[i] = 0xf81f;
    }

    for( int i = 239 * SCREEN_WIDTH; i < 239 * SCREEN_WIDTH + SCREEN_WIDTH; ++i )
    {
        displayBitmap[i] = 0xf800;
    }

    //glRasterPos2f( 0, SCREEN_HEIGHT - 0.1 );
    glRasterPos2i( 0, SCREEN_HEIGHT - 1 );
    glPixelZoom( 1, -1 );
    glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
    glDrawPixels( SCREEN_WIDTH, SCREEN_HEIGHT, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, displayBitmap );
}

このまま実行すると、(0,1) に紫色の線が表示されます。つまり、1 本の黒い線、次に紫色の線、そして目に見えない下の領域にある赤い線です。

OK、だから私は変わる

glRasterPos2i( 0, SCREEN_HEIGHT - 1 );

glRasterPos2i( 0, SCREEN_HEIGHT );

いいえ、出力が破損しています。奇妙なことに、次のように変更すると:

glRasterPos2f( 0, SCREEN_HEIGHT - 0.1 );

両方の線が正しい順序で描画されます (SCREEN_HEIGHT と SCREEN_HEIGHT - 1.0 は整数バージョンと同じ結果になります)。

ここで何が間違っていますか?画面の幅 = 320、画面の高さ = 240。

4

3 に答える 3

5

これは私のために働く:

void display() {
 unsigned char *pixels=captureScreenRegion(0,0,window_width,window_height);
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glRasterPos2f(-1,1);
 glPixelZoom( 1, -1 );
 glDrawPixels(window_width,window_height,GL_RGB,GL_BYTE,pixels);
 free(pixels);
 glutSwapBuffers();
}
于 2013-07-06T08:40:42.183 に答える
4

glDrawPixels は、コンシューマ グレードのハードウェアでは十分にサポートされていません。また、新しい OpenGL バージョンでは、完全に削除されています。これを機能させるために時間を費やす代わりに、画像をテクスチャにロードし、単純なシェーダーでテクスチャ付きクワッドを描画するだけです。

私を信じてください、glDrawPixels をいじるのは努力する価値がありません。

于 2013-04-08T08:18:01.647 に答える
1

私はあなたと同じ問題に遭遇します。私はこのように解決しました:

void VideoRenderWidget::resizeGL(int w, int h)
{
    glViewport( 0, 0, w, h );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    glOrtho( 0, w, 0, h, 0.1, 1 );
    glPixelZoom( 1, -1 );
    glRasterPos3f(0, h - 1, -0.3);
}

void VideoRenderWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glDrawPixels(704, 576, GL_RGB, GL_UNSIGNED_BYTE, buffer_.data_);
}


これは私にとってはうまくいきました..私はまだこれを開発しています..ここで704はビデオの幅で、576は高さです。

于 2015-02-12T15:19:14.307 に答える