[Interest] QML / OpenGL / scene graph problem.

Guido Seifert wargand at gmx.de
Sun Dec 1 17:00:33 CET 2013


Hi and help!

I have a problem here. Unfortunately I am not very experienced with OpenGL and need a hint in which
direction I have to look to fix the following problem.

I took the HelloGL code from the examples and wanted to make it into a QML widget. I cannot my 
experiments are a total failure, but unfortunately they are far from a total success also.

https://imageshack.com/i/59c6eip
https://imageshack.com/i/jmg97op

The pics above show my problem. The old TT logo is recognizable, but the parts do not 'fit'. 
Also there is something wrong with the ring.

This is strange, because I did not change anything in the way the mesh is calculated.
It is 100% as found in the HelloGL example.

The only thing I did was to put the OpenGL code into a paint() function. Similar to the
one in the 'OpenGL Under QML example'. The paint function is plenty of copy/paste trial/error.
And it certainly will change as soon as I get a better understandig about the scene graph
stuff. 

But until then... does anyone see why the geometry of the TT logo is distorted?

Guido

void Squircle::paint()
{
   glViewport(0, 0, window()->width(), window()->height());
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
#ifdef QT_OPENGL_ES_1
   glOrthof(-0.5, +0.5, -0.5, +0.5, 4.0, 15.0);
#else
   glOrtho(-0.5, +0.5, -0.5, +0.5, 4.0, 15.0);
#endif
   glMatrixMode(GL_MODELVIEW);

   glEnable(GL_DEPTH_TEST);
   glEnable(GL_CULL_FACE);
   glShadeModel(GL_SMOOTH);
   glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);
   glEnable(GL_MULTISAMPLE);

   static GLfloat lightPosition[4] = { 0.5, 5.0, 7.0, 1.0 };
   glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);

    delete m_fbo;
    m_fbo = 0;

    int width  = this->width();
    int height = this->height();

    if (width && height){
       m_fbo = new QOpenGLFramebufferObject(width, height);
    }

    if (m_fbo){
     QOpenGLFunctions glFunctions(QOpenGLContext::currentContext());
     glFunctions.glUseProgram(0);
     QObject::connect(QOpenGLContext::currentContext(), 
        SIGNAL(aboutToBeDestroyed()), this, SLOT(cleanup()), Qt::DirectConnection);
     m_fbo->bind();
     glClearColor(0, 0, 0, 1);
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     glLoadIdentity();
     glTranslatef(0.0, 0.0, -10.0);
     glRotatef(mXRot / 16.0, 1.0, 0.0, 0.0);
     glRotatef(mYRot / 16.0, 0.0, 1.0, 0.0);
     glRotatef(mZRot / 16.0, 0.0, 0.0, 1.0);
     mMesh->setColor("green");
     mMesh->draw();
	
     m_fbo->release();
     m_fbo->blitFramebuffer(this->window()->renderTarget(), m_fbo);

   }
}



More information about the Interest mailing list