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 |
|
---|