Using QImage with OpenGL

前端 未结 3 1514
一整个雨季
一整个雨季 2020-12-09 21:19

I\'ve very recently picked up Qt and am using it with OpenGL The thing though is that when moving my SDL code to Qt and changing the texture code to use QImage it stops work

3条回答
  •  醉话见心
    2020-12-09 21:26

    I have similar code that works but uses glTexSubImage2D :

    void Widget::paintGL() 
    {
        glClear (GL_COLOR_BUFFER_BIT);       
        glDisable(GL_DEPTH_TEST);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();        
        gluOrtho2D(0,win.width(),0,win.height());
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();        
        glEnable(GL_TEXTURE_2D);
    
        glBindTexture(GL_TEXTURE_2D,texture); 
        glTexSubImage2D(GL_TEXTURE_2D, 0, 0,0 , image.width(), image.height(),  glFormat, glType, image.bits() );       
        glBegin(GL_QUADS);   // in theory triangles are better
        glTexCoord2i(0,0); glVertex2i(0,win.height());
        glTexCoord2i(0,1); glVertex2i(0,0);
        glTexCoord2i(1,1); glVertex2i(win.width(),0);
        glTexCoord2i(1,0); glVertex2i(win.width(),win.height());
        glEnd();             
    
        glFlush();
    }
    
    
    void Widget::initializeGL() 
    {
        glClearColor (0.0,0.0,0.0,1.0);
        glDisable(GL_DEPTH_TEST);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();        
        gluOrtho2D(0,win.width(),0,win.height());
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();        
    
        glEnable(GL_TEXTURE_2D);
        glGenTextures(3,&texture);
        glBindTexture(GL_TEXTURE_2D,texture);       
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);          
        glBindTexture(GL_TEXTURE_2D,texture);               
        glTexImage2D(GL_TEXTURE_2D, 0, glFormat, image.width(), image.height(), 0, glFormat, glType, NULL );    
    
        glDisable(GL_TEXTURE_2D);
    }
    

    And a few perfomance tweaks in the ctor

    void Widget::setDisplayOptions()
    {
        glFormat = GL_RGB;  //  QImage RGBA is BGRA
        glType = GL_UNSIGNED_BYTE;
    
        QGL::setPreferredPaintEngine(QPaintEngine::OpenGL2);
    
        QGLFormat glFmt;
        glFmt.setSwapInterval(1); // 1= vsync on 
        glFmt.setAlpha(GL_RGBA==glFormat);
        glFmt.setRgba(GL_RGBA==glFormat); 
        glFmt.setDoubleBuffer(true); // default
        glFmt.setOverlay(false);
        glFmt.setSampleBuffers(false);
        QGLFormat::setDefaultFormat(glFmt);
    
        setAttribute(Qt::WA_OpaquePaintEvent,true);
        setAttribute(Qt::WA_PaintOnScreen,true);        
    }
    

提交回复
热议问题