2013/4/20 James Turner <[email protected]>: > > On 18 Apr 2013, at 09:09, Till Oliver Knoll <[email protected]> > wrote: > > So is OpenGL 3.x Core actually supposed to work with Qt 5? Or is this > still work in progress? > > > It works fine, but the legacy QGL APIs don't help you much. Rough > pseudo-code which works for me: > > QWindow *win = new QWindow > win->setSurfaceType( OpenGLSurface ); > > QSurfaceFormat format; > format.setMajorVersion( 3 ); > format.setMinorVersion( 2 ); > format.setProfile( QSurfaceFormat::CoreProfile );
Thanks for the hint about QWindow/OpenGLSurface - didn't know that new Qt 5 API yet ;) And I figured out by now why the previously mentioned "OpenGL Windows" example "did not work": http://qt-project.org/doc/qt-5.0/qtgui/openglwindow.html It uses the said QWindow API and basically re-implements the QGLWidget "initialise-/paint-/resizeGL" functionality - without actually rendering anything, hence my impression that "it did not work". Still: Resizing the window of that example is *terribly* slow on my iMac, even in release mode! It feels like 3 frames per second or even slower (compared to the QGLWidget shown as top-level widget which resizes smoothly). The actual code which would render a triangle is given as code fragments in the example description itself ("Example OpenGL rendering sub class"), even though it probably still contains "work in progress" (or "dead") code, as in: GLuint TriangleWindow::loadShader(GLenum type, const char *source) // should probably be removed It is also noteworthy that this "TriangleWindow" example given in the Qt docs uses explicitly the attribute indices when setting them (m_posAttr, m_colAttr) and off course uses the old Shader syntax (prior to shader version 1.30, I guess) when declaring variables ("attribute" instead of the new "in/out" syntax). As a matter of fact in my own example - again, derived from the "coloring" example in http://releases.qt-project.org/learning/developerguides/qtopengltutorial/OpenGLTutorial.pdf I "downgraded" the shaders to use the old syntax "attribute", added #version 120 and used the default (on OS X) OpenGL 2.1 context - eh voilà! The GL_INVALID error after my shaderProgram.setAttributeArray("vertex", vertices.constData()); disappeared! But I still got a black screen (at least without any warning/error on the console), so there must still be something wrong with my example code... but I have to invest some more time in that. (I just noticed: maybe I should allocate the shader program on the heap instead of on the stack, just like in the "TriangleWindow" example? Maybe that would make a difference in the sense that the underlying dynamically linked GL functions would be different, according to the current OpenGL context)? I yet have to try out that "TriangleWindow" example code and see whether it actually works. However, even it it would work and apart from the huge performance issues: it would be of no use to me, because QWindow is not derived from QWidget, is it? So what's the use of having a GL based windows in a *desktop* application (except for "full-screen" usage maybe)? I really need a QGLWidget... And apart from QGLWidget and QGLFormat - which apparenty are /not/ deprecated in Qt 5, and I don't see any QOpenGLFormat, for instance - I am not using any deprecated Qt OpenGL functionality AFAICT: I replaced the QGLShaderProgram with QOpenGLShaderProgram. My assumption/expectation is off course that QOpenGLShaderProgram /should/ work within a QGLWidget - with a Core 3.2 GL context, that is. I'll investigate more, especially I will start over from an example that actually /does/ work from the very beginning, and try to squeeze that into a QGLWidget with a Core 3.2 GL context, using QOpenGLShader. In the meantime: could you confirm that you are really using a shader version of at least 1.30 (or better yet: 1.50) with the new in/out syntax? Does http://qt-project.org/doc/qt-5.0/qtgui/qopenglshaderprogram.html#setAttributeArray-8 (as opposed to the version where you pass the attribute /index/ as parameter) work for you? And are you really implying that OpenGL 3.2 (or above) is officially not supported with QGLWidget - at least not with the "Qt OpenGL API"? Oh, and with respect to "in vec4 color" vs "in vec3 color": I assume that the Qt API will properly define the array passed along by QVector<QVector3D> with a corresponding call to glVertexAttribPointer, and the OpenGL vertex shader will fill the missing values in a "vec4" defintion with default values, right? So the initial "color" example by Digia should work correctly in that respect (passing along Vector3D data when the shader expects a vec4)? The last point is off course an OpenGL related question only (the new "Red Book" covering OpenGL 4.3 is already on the way ;)) Thanks! Oliver _______________________________________________ Interest mailing list [email protected] http://lists.qt-project.org/mailman/listinfo/interest
