[556] | 1 | \section1 Introduction
|
---|
| 2 |
|
---|
| 3 | \l {http://www.opengl.org}{OpenGL} is an industry standard API for
|
---|
| 4 | 2D/3D graphics. It provides a powerful, low-level interface between
|
---|
| 5 | software and acceleration hardware, and it is operating system and
|
---|
| 6 | window system independent. \l {http://www.khronos.org/opengles}{OpenGL ES}
|
---|
| 7 | is a subset of the \l {http://www.opengl.org}{OpenGL} standard. Because it
|
---|
| 8 | is designed for use with embedded systems, it has a smaller, more
|
---|
| 9 | constrained API.
|
---|
| 10 |
|
---|
| 11 | \l {http://www.khronos.org/opengles/1_X}{OpenGL ES version 1.x} is designed for
|
---|
| 12 | fixed function hardware, while its successor \l
|
---|
| 13 | {http://www.khronos.org/opengles/2_X}{OpenGL ES version 2.x} is designed for
|
---|
| 14 | programmable hardware. It is worth noting that there is a significant
|
---|
| 15 | difference between the two, and that they are not compatible with each
|
---|
| 16 | other. OpenGL ES 1.x limits processing to a pre-defined set of fixed
|
---|
| 17 | options for drawing and lighting objects. OpenGL 2.x has a significantly
|
---|
| 18 | shorter graphics pipeline than 1.x. Instead of using function
|
---|
| 19 | transformation and a fragment pipeline, 2.x uses the \l
|
---|
| 20 | {http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf}{OpenGL
|
---|
| 21 | ES Shading Language (GLSL ES)}. Instead of using the pre-defined functions,
|
---|
| 22 | the programmer writes small shader programs telling the hardware in detail
|
---|
| 23 | how to render each object.
|
---|
| 24 |
|
---|
| 25 | The \l {QtOpenGL module} offers classes that make it easy to draw 3D
|
---|
| 26 | graphics in GUI applications using OpenGL ES. Qt provides a plugin that
|
---|
| 27 | integrates both OpenGL ES versions \l
|
---|
| 28 | {http://www.khronos.org/opengles/1_X}{1.x} and \l
|
---|
| 29 | {http://www.khronos.org/opengles/2_X}{2.x} with Qt for Embedded. However,
|
---|
| 30 | Qt for Embedded can be adapted to a wide range of OpenGL versions.
|
---|
| 31 |
|
---|
| 32 | To translate QPainter operations into OpenGL ES calls (there are actually
|
---|
| 33 | two subclasses, one for OpenGL/ES 1.1 and another for OpenGL/ES 2.0), Qt
|
---|
| 34 | uses a subclass of QPaintEngine. This specialized paint engine can be used
|
---|
| 35 | to improve 2D rendering performance on appropriate hardware. It can also
|
---|
| 36 | overlay controls and decorations onto 3D scenes drawn using OpenGL.
|
---|
| 37 |
|
---|
| 38 | \tableofcontents
|
---|
| 39 |
|
---|
| 40 | \section1 Using OpenGL ES with Qt
|
---|
| 41 | To use OpenGL-enabled widgets in a Qt for Embedded application, all that is
|
---|
| 42 | required is to subclass QGLWidget and draw into instances of the subclass
|
---|
| 43 | with standard OpenGL functions. The current implementation only
|
---|
| 44 | supports OpenGL ES and 2D painting within a QGLWidget. Using OpenGL ES to
|
---|
| 45 | accelerate regular widgets as well as compositing top-level windows with
|
---|
| 46 | OpenGL ES are not currently supported. These issues will be addressed in
|
---|
| 47 | future versions of Qt.
|
---|
| 48 |
|
---|
| 49 | \note The OpenGL paint engine is not currently supported in regular
|
---|
| 50 | widgets. However, any application that uses QGraphicsView can set a
|
---|
| 51 | QGLWidget as the viewport and obtain access to the OpenGL paint engine that
|
---|
| 52 | way:
|
---|
| 53 |
|
---|
| 54 | \code
|
---|
| 55 | QGraphicsView view(&scene);
|
---|
| 56 | view.setViewport(new QGLWidget());
|
---|
| 57 | view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
---|
| 58 | view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
---|
| 59 | view.setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
|
---|
| 60 | view.setFrameStyle(0);
|
---|
| 61 | view.showFullScreen();
|
---|
| 62 | \endcode
|
---|
| 63 |
|
---|
| 64 | It is recommended that the QGraphicsView::FullViewportUpdate flag
|
---|
| 65 | be set because the default double-buffered behavior of QGLWidget
|
---|
| 66 | does not support partial updates. It is also recommended that the
|
---|
| 67 | window be shown full-screen because that usually has the best
|
---|
| 68 | performance on current OpenGL ES implementations.
|
---|
| 69 |
|
---|
| 70 | Once a QGraphicsView has been initialized as above, regular widgets
|
---|
| 71 | can be added to the canvas using QGraphicsProxyWidget if the
|
---|
| 72 | application requires them.
|
---|
| 73 |
|
---|
| 74 | \note OpenGL ES 2.X does not support PBuffers, so QGLPixelBuffer will not
|
---|
| 75 | work. In this case, QGLFramebufferObject should be used instead. However,
|
---|
| 76 | OpenGL ES 1.X does not support Framebuffer objects, with the exception of
|
---|
| 77 | some OpenGL ES 1.X extensions. In this case, please use QGLPixelBuffer.
|
---|
| 78 |
|
---|
| 79 | \note On most embedded hardware, the OpenGL implementation is
|
---|
| 80 | actually \l{http://www.khronos.org/opengles/1_X/}{OpenGL/ES 1.1} or
|
---|
| 81 | \l{http://www.khronos.org/opengles/2_X/}{OpenGL/ES 2.0}. When painting
|
---|
| 82 | within a QGLWidget::paintGL() override, it is necessary to limit the
|
---|
| 83 | application to only the features that are present in the OpenGL/ES
|
---|
| 84 | implementation.
|
---|
| 85 |
|
---|