Как масштабировать glDrawPixels? - PullRequest
5 голосов
/ 08 января 2012

Мне нужно масштабировать результат изображения glDrawPixels.

Я рисую буфер изображения 640x480 пикселей с glDrawPixels в Qt QGLWidget.

Я попытался сделать следующее в PaintGL:

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

Но это не такt работа.

Я устанавливаю область просмотра OpenGL и glOrtho с размером виджета следующим образом:

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 ( );
    }

Ответы [ 3 ]

5 голосов
/ 08 января 2012

Похоже, что вместо того, чтобы вызывать glDrawPixels (), вам нужно загрузить данные изображения в текстуру и нарисовать текстурированный квадрат размером с окно. Так что-то вроде этого:

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) также может помочь.

2 голосов
/ 08 апреля 2014

Просто для дальнейшего ознакомления: вместо того, чтобы делать glScalef(windowWidth/640, windowHeight/480, 0); перед glDrawPixels, вы должны сделать пиксельное увеличение:

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);
1 голос
/ 08 января 2012

Мне нужно масштабировать результат изображения glDrawPixels.

glDrawPixels напрямую отправляется в кадровый буфер.Таким образом, каждый входящий пиксель отображается 1: 1 на выход.Есть функция (ах, зачем я вам это говорю) glPixelZoom , которая позволяет вам масштабировать glDrawPixels.

НО я призываю вас не использовать glDrawPixels!

Вместо этого используйте квадраты текстур.glDrawPixels - устаревшая функция, более не поддерживаемая современным OpenGL-3.И даже если это не устарело, это все еще очень медленная функция.Текстурированные четырехугольники лучше во всех отношениях.

...