首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何扩展glDrawPixels?

如何扩展glDrawPixels?
EN

Stack Overflow用户
提问于 2012-01-08 09:00:21
回答 3查看 5.5K关注 0票数 5

我需要缩放glDrawPixels图像的结果。

我在Qt QGLWidget中用glDrawPixels绘制了一个640x480像素的图像缓冲区。

我尝试在PaintGL中执行以下操作:

代码语言:javascript
复制
glScalef(windowWidth/640, windowHeight/480, 0);
glDrawPixels(640,480,GL_RGB,GL_UNSIGNED_BYTE,frame);

但它不起作用。

我将小部件的大小设置为OpenGL视区和glOrtho:

代码语言:javascript
复制
void WdtRGB::paintGL() {

         glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

         // Setup the OpenGL viewpoint
         glMatrixMode(GL_PROJECTION);
         glLoadIdentity();
         glOrtho(0, windowWidth, windowHeight, 0, -1.0, 1.0);

    glDepthMask(0);
        //glRasterPos2i(0, 0);
        glScalef(windowWidth/640, windowHeight/480, 0);
        glDrawPixels(640,480,GL_RGB,GL_UNSIGNED_BYTE,frame);
    }

    //where windowWidth and windowHeight corresponds to the widget size.
    /the init functions are:

    void WdtRGB::initializeGL() {

        glClearColor ( 0.8, 0.8, 0.8, 0.0); // Background to a grey tone

        /* initialize viewing values  */
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();

        glOrtho(0, windowWidth, windowHeight, 0, -1.0, 1.0);

        glEnable (GL_DEPTH_TEST);

    }

    void WdtRGB::resizeGL(int w, int h) {
        float aspect=(float)w/(float)h;

        windowWidth = w;
        windowHeight = h;
        glViewport (0, 0, (GLsizei) w, (GLsizei) h);
        glMatrixMode (GL_PROJECTION);
        glLoadIdentity ();

        if( w <= h )
                glOrtho ( -5.0, 5.0, -5.0/aspect, 5.0/aspect, -5.0, 5.0);
        else
                glOrtho (-5.0*aspect, 5.0*aspect, -5.0, 5.0, -5.0, 5.0);

        //printf("\nresize");
        emit changeSize ( );
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-08 09:12:48

听起来你真正需要做的不是调用glDrawPixels (),而是将你的图像数据加载到一个纹理中,并绘制一个窗口大小的纹理四边形。所以就像这样:

代码语言:javascript
复制
glGenTextures (1, &texID);
glBindTextures (GL_TEXTURE_RECTANGLE_EXT, texID);
glTexImage2D (GL_TEXTURE_RECTANGLE_EXT, 0, GL_RGBA, 640, 480, 0, GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, frame);
glBegin (GL_QUADS);
glTexCoord2f (0, 0);
glVertex2f (0, 0);
glTexCoord2f (640, 0);
glVertex2f (windowWidth, 0);
glTexCoord2f (640, 480);
glVertex2f (windowWidth, windowHeight);
glTexCoord2f (0, 480);
glVertex2f (0, windowHeight);
glEnd();

或者,如果工作太多,glPixelZoom (windowWidth / 640,windowHeight / 480)也可以做到这一点。

票数 5
EN

Stack Overflow用户

发布于 2014-04-08 16:58:28

仅供进一步参考:不是在glDrawPixels之前进行glScalef(windowWidth/640, windowHeight/480, 0);,而是应该进行像素缩放:

代码语言:javascript
复制
glRasterPos2i(0,0);
GLint iViewport[4];
glGetIntegerv(GL_VIEWPORT, iViewport);
glPixelZoom(iViewport[2]/640, iViewport[3]/480);
glDrawPixels(640,480,GL_RGB,GL_UNSIGNED_BYTE,frame);
票数 2
EN

Stack Overflow用户

发布于 2012-01-08 21:33:49

我需要缩放glDrawPixels图像的结果。

glDrawPixels直接转到帧缓冲区。因此,每个传入像素都以1:1的比例映射到输出。有一个(啊,我为什么要告诉你这个) glPixelZoom函数,可以让你缩放glDrawPixels。

但我强烈建议您不要使用glDrawPixels!

请改用纹理四边形。glDrawPixels是一个折旧的函数,现代OpenGL-3不再支持它。即使它没有被弃用,它仍然是一个非常慢的函数。纹理四边形在各个方面都更好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8774521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档