1 | TinyGL 0.4 (c) 1997-2002 Fabrice Bellard. |
---|
2 | |
---|
3 | General Description: |
---|
4 | -------------------- |
---|
5 | |
---|
6 | TinyGL is intended to be a very small implementation of a subset of |
---|
7 | OpenGL* for embedded systems or games. It is a software only |
---|
8 | implementation. Only the main OpenGL calls are implemented. All the |
---|
9 | calls I considered not important are simply *not implemented*. |
---|
10 | |
---|
11 | The main strength of TinyGL is that it is fast and simple because it |
---|
12 | has not to be exactly compatible with OpenGL. In particular, the |
---|
13 | texture mapping and the geometrical transformations are very fast. |
---|
14 | |
---|
15 | The main features of TinyGL are: |
---|
16 | |
---|
17 | - Header compatible with OpenGL (the headers are adapted from the very good |
---|
18 | Mesa by Brian Paul et al.) |
---|
19 | |
---|
20 | - Zlib-like licence for easy integration in commercial designs (read |
---|
21 | the LICENCE file). |
---|
22 | |
---|
23 | - Subset of GLX for easy testing with X Window. |
---|
24 | |
---|
25 | - GLX like API (NGLX) to use it with NanoX in MicroWindows/NanoX. |
---|
26 | |
---|
27 | - Subset of BGLView under BeOS. |
---|
28 | |
---|
29 | - OpenGL like lightening. |
---|
30 | |
---|
31 | - Complete OpenGL selection mode handling for object picking. |
---|
32 | |
---|
33 | - 16 bit Z buffer. 16/24/32 bit RGB rendering. High speed dithering to |
---|
34 | paletted 8 bits if needed. High speed conversion to 24 bit packed |
---|
35 | pixel or 32 bit RGBA if needed. |
---|
36 | |
---|
37 | - Fast Gouraud shadding optimized for 16 bit RGB. |
---|
38 | |
---|
39 | - Fast texture mapping capabilities, with perspective correction and |
---|
40 | texture objects. |
---|
41 | |
---|
42 | - 32 bit float only arithmetic. |
---|
43 | |
---|
44 | - Very small: compiled code size of about 40 kB on x86. The file |
---|
45 | src/zfeatures.h can be used to remove some unused features from |
---|
46 | TinyGL. |
---|
47 | |
---|
48 | - C sources for GCC on 32/64 bit architectures. It has been tested |
---|
49 | succesfully on x86-Linux and sparc-Solaris. |
---|
50 | |
---|
51 | Examples: |
---|
52 | --------- |
---|
53 | |
---|
54 | I took three simple examples from the Mesa package to test the main |
---|
55 | functions of TinyGL. You can link them to either TinyGL, Mesa or any |
---|
56 | other OpenGL/GLX implementation. You can also compile them with |
---|
57 | Microwindows. |
---|
58 | |
---|
59 | - texobj illustrates the use of texture objects. Its shows the speed |
---|
60 | of TinyGL in this case. |
---|
61 | |
---|
62 | - glutmech comes from the GLUT packages. It is much bigger and slower |
---|
63 | because it uses the lightening. I have just included some GLU |
---|
64 | functions and suppressed the GLUT related code to make it work. It |
---|
65 | shows the display list handling of TinyGL in particular. You can look |
---|
66 | at the source code to learn the keys to move the robot. The key 't' |
---|
67 | toggles between shaded rendering and wire frame. |
---|
68 | |
---|
69 | - You can download and compile the VReng project to see that TinyGL |
---|
70 | has been successfully used in a big project |
---|
71 | (http://www-inf.enst.fr/vreng). |
---|
72 | |
---|
73 | Architecture: |
---|
74 | ------------- |
---|
75 | |
---|
76 | TinyGL is made up four main modules: |
---|
77 | |
---|
78 | - Mathematical routines (zmath). |
---|
79 | |
---|
80 | - OpenGL-like emulation (zgl). |
---|
81 | |
---|
82 | - Z buffer and rasterisation (zbuffer). |
---|
83 | |
---|
84 | - GLX interface (zglx). |
---|
85 | |
---|
86 | To use TinyGL in an embedded system, you should look at the GLX layer |
---|
87 | and modify it to suit your need. Adding a more user friendly |
---|
88 | developper layer (as in Mesa) may be useful. |
---|
89 | |
---|
90 | Notes - limitations: |
---|
91 | -------------------- |
---|
92 | |
---|
93 | - See the file 'LIMITATIONS' to see the current functions supported by the API. |
---|
94 | |
---|
95 | - The multithreading could be easily implemented since no global state |
---|
96 | is maintainted. The library gets the current context with a function |
---|
97 | which can be modified. |
---|
98 | |
---|
99 | - The lightening is not very fast. I supposed that in most games the |
---|
100 | lightening is computed by the 3D engine. |
---|
101 | |
---|
102 | - Some changes are needed for 64 bit pointers for the handling of |
---|
103 | arrays of float with the GLParam union. |
---|
104 | |
---|
105 | - List sharing is partialy supported in the source, but not by the |
---|
106 | current TinyGLX implementation (is it really useful ?). |
---|
107 | |
---|
108 | - No user clipping planes are supported. |
---|
109 | |
---|
110 | - No color index mode (no longer useful !) |
---|
111 | |
---|
112 | - The mipmapping is not implemented. |
---|
113 | |
---|
114 | - The perspecture correction in the mapping code does not use W but |
---|
115 | 1/Z. In any 'normal scene' it should work. |
---|
116 | |
---|
117 | - The resizing of the viewport in TinyGLX ensures that the width and |
---|
118 | the height are multiples of 4. This is not optimal because some pixels |
---|
119 | of the window may not be refreshed. |
---|
120 | |
---|
121 | Why ? |
---|
122 | ----- |
---|
123 | |
---|
124 | TinyGL was developped as a student project for a Virtual Reality |
---|
125 | network system called VReng (see the VReng home page at |
---|
126 | http://www-inf.enst.fr/vreng). |
---|
127 | |
---|
128 | At that time (January 1997), my initial project was to write my own 3D |
---|
129 | rasterizer based on some old sources I wrote. But I realized that it |
---|
130 | would be better to use OpenGL to work on any platform. My problem was |
---|
131 | that I wanted to use texture mapping which was (and is still) quite |
---|
132 | slower on many software OpenGL implementation. I could have modified |
---|
133 | Mesa to suit my needs, but I really wanted to use my old sources for |
---|
134 | that project. |
---|
135 | |
---|
136 | I finally decided to use the same syntax as OpenGL but with my own |
---|
137 | libraries, thinking that later it could ease the porting of VReng to |
---|
138 | OpenGL. |
---|
139 | |
---|
140 | Now VReng is at last compatible with OpenGL, and I managed to patch |
---|
141 | TinyGL so that VReng can still work with it without any modifications. |
---|
142 | |
---|
143 | Since TinyGL may be useful for some people, especially in the world of |
---|
144 | embedded designs, I decided to release it 'as is', otherwise, it would |
---|
145 | have been lost on my hard disk ! |
---|
146 | |
---|
147 | ------------------------------------------------------------------------------ |
---|
148 | * OpenGL(R) is a registered trademark of Silicon Graphics, Inc. |
---|
149 | ------------------------------------------------------------------------------ |
---|
150 | Fabrice Bellard. |
---|