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) 处得到紫线,即一条黑线,然后是紫线,然后在不可见的底部区域是红线。

好的,所以我改变

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 回答