| [1] | 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. | 
|---|