1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
|
AllegroGL HOWTO
===============
HOWTO file
AllegroGL web site: http://allegrogl.sourceforge.net/
Table of contents:
1.0 Introduction
1.1 About the library
1.2 About OpenGL
1.3 About this document
2.0 The Basic
2.1 Using AllegroGL for your Window
2.2 States and screen update
2.3 Coordinate Systems
2.4 Text and fonts
2.5 The Mouse
3.0 I just want OpenGL! Help!
4.0 Contact information
1.1 About the library
~~~~~~~~~~~~~~~~~~~~~
The library mostly provides functions to allow you to use OpenGL alongside
Allegro -- you use OpenGL for your rendering to the screen, and Allegro
for miscellaneous tasks like gathering input, doing timers, getting
cross-platform portability, loading data, playing samples and drawing your
textures. So this library fills the same hole that things like GLUT do.
AllegroGL works with X Window, Microsoft Windows, DOS (via Mesa) and
Mac OS X.
1.2 About OpenGL
~~~~~~~~~~~~~~~~
OpenGL is a long-standing Graphics API originally developed by SGI, but
now controlled by the people at http://www.opengl.org. It is just an API
and not an actual library; there are various libraries that implement the
OpenGL standard from the likes of Microsoft (supplied with Windows). There
is also a free implementation of the OpenGL standard called Mesa, but this
is unofficial and shouldn't really be called OpenGL. You can get it at
http://www.mesa3d.org. Mesa3D is a cross-platform library and even works
in DOS.
The OpenGL specification has reached version 1.4. As of October 2002 not all
OpenGL drivers are compliant with 1.4 but many of them are compliant with 1.3.
However Microsoft Windows OpenGL implementation is still only version 1.1.
However, it is possible to access the OpenGL 1.3 functionality within Windows
as long as the drivers supports it. You'll need to get the modified GLsdk
(created by SGI and Intel). AllegroGL will automatically detect its presence
and link to it.
1.3 About this document
~~~~~~~~~~~~~~~~~~~~~~~
This document serves as a guide to using AllegroGL from the perspective of
an Allegro user, but it should be useful for anyone getting to know
AllegroGL. It is intended to be read from start to end, as I've used
explanations of how features work to explain other features.
To install AllegroGL please read the readme file.
See the included FAQ before asking any questions to the developpers.
There is also a reference built from comments within the AllegroGL code,
available as a download from the AllegroGL site. This details many
commands and options that I haven't talked about here.
2.0 The Basics
--------------
AllegroGL replaces much of Allegro's rendering code on initialisation with
code that interfaces with OpenGL. Your old commands such as blit() and line()
will still work and this is called AllegroGL Direct Mode. Unfortunately
Direct Mode is incomplete and not very fast, so it is probably a better
idea for you to use your own calls to OpenGL. It is important to remember
that AllegroGL Direct Mode is emulated and the functions you are calling
all end up as OpenGL modes. You should note that the above only applies
to drawing stuff on the screen or on video bitmaps. Memory operations are
still done using regular Allegro, so they work properly.
If you don't already know OpenGL here are some suggested resources:
- The "OpenGL Programming Guide" aka "The Red Book".
This is a lengthy book which can be downloaded from
http://www.opengl.org/ in pdf format.
- If you need the OpenGL syntax reference, check out the OpenGL.org
reference: http://www.opengl.org/developers/documentation/specs.html
- Various specific tutorials are available from http://www.gamedev.net/ .
This is also another place to try and download the Red Book.
- NeHe's tutorials are available from http://nehe.gamedev.net/
- The AllegroGL sourcecode and examples!
- There's a page full of links at
http://members.net-tech.com.au/alaneb/assemble.htm
- There is a set of teaching notes that I don't know the URL of entitled
"CPEN 461/661, Spring 1997 OpenGL Tutorial"
2.1 Using AllegroGL for your Window
-----------------------------------
- AllegroGL needs to be initialized like nearly all Allegro addons. You
use the install_allegro_gl() command. I suggest you do it just after
allegro_init().
- When you set your graphics mode, via set_gfx_mode(), you have to use
one of the following devices:
- GFX_OPENGL - Either a fullscreen or window, depending
on platform and configuration.
- GFX_OPENGL_FULLSCREEN - Fullscreen driver. Only supports "normal"
resolutions, like 640x480.
- GFX_OPENGL_WINDOWED - Supports any resolution, such as 543x365
Virtual screens are not supported. Regular Allegro screen modes are
still available though, so using GFX_AUTODETECT will behave as if
AllegroGL wasn't present. Allegro alone does not support an OpenGL
rendering context, so OpenGL calls will *fail* when in an Allegro
mode, and can even crash the computer. Only run OpenGL commands when
in an OpenGL mode.
If you want your program to be more portable, you should use
GFX_OPENGL exclusively and let the driver decide whether to use
fullscreen or a window. You can still give the driver a hint as to
which one you'd like by using allegro_gl_set(AGL_WINDOWED, TRUE) or
the likes. See the docs for details.
IMPORTANT NOTE:
If you switch out of an OpenGL mode, you will lose the current
context. This means that all your converted fonts, display lists,
textures, video bitmaps, and so on, will be LOST. Remember to
destroy AllegroGL fonts before switching out of OpenGL to avoid
problems when switching back in.
2.2 States and screen update
----------------------------
Now this is where I'm going to stress how OpenGL and therefore AllegroGL
is/are a state machine. Basically this means you apply various states to
OpenGL/AllegroGL which affect the behaviour of future functions. This is
opposed to how Allegro normally does things as Allegro normally just uses
lots of function arguments instead.
- OpenGL/AllegroGL have their own page flipping code. You do it
differently to Allegro. First, before you set the graphics mode,
you need to set an AllegroGL state
- allegro_gl_set(AGL_DOUBLEBUFFER, 1);
- allegro_gl_set(AGL_REQUIRE, AGL_DOUBLEBUFFER);
This shows how to do AllegroGL states. You set a state, then you tell
AllegroGL if it is AGL_REQUIRE (required) or AGL_SUGGEST (suggested)
or AGL_DONTCARE (irrelevant).
- allegro_gl_flip() will do the page flipping. You don't need to
bother juggling multiple screens.
IMPORTANT NOTE:
The page flip may be implemented as a double buffer. That's
driver-dependant, and there's no way to control it from your program
unless you interface directly with the drivers. The other important
bit is that the 'screen' BITMAP may not be what you see on the screen.
If you've flipped page, then 'screen' will contain the *previous*
frame, and not the current one. In fact, the OpenGL defines the content
of the 'screen' as *undefined* after a flip, so you are not guaranteed to
have anything meaningful in there. It is recommended that you either clear
the screen, or redraw the screen completely at every frame.
Now how do you select the colour depth? Here's how to suggest an 8-bit colour
depth:
- allegro_gl_set (AGL_COLOR_DEPTH, 8);
- allegro_gl_set (AGL_SUGGEST, AGL_COLOR_DEPTH);
set_color_depth() will also work, but like Allegro, it becomes a required
depth, which means that your application may not work on some machines if
you don't support multiple depths. This is where AllegroGL comes in.
If no color depth was specified by either calls to allegro_gl_set() or
set_color_depth(), then AllegroGL will use the Allegro default depth - 8 bpp.
One last graphics mode option: AGL_RENDERMETHOD can be set to 1
for hardware acceleration and 0 for software mode.
Of course, all these graphics options must be set before you switch
graphics modes. Graphic options will have no effect until set_gfx_mode()
is called.
OpenGL states are done with the glEnable and glDisable commands.
2.3 Coordinate Systems
----------------------
Allegro and OpenGL/AllegroGL use different co-ordinate systems. The
AllegroGL Direct Mode commands should work the same as Allegros'.
If you are using Allegro commands, and you are inside an
allegro_gl_set_allegro_mode()/unset_allegro_mode() block, then the commands
will behave like their Allegro counterparts. Otherwise, the behaviour is
undefined.
In Allegro, the Top-left corner of the screen is the origin. The X-axis
goes to the right and the Y-axis goes down. The Screen is the same width
and height as the resolution (eg. 640 x 480).
In OpenGL, the centre of the screen is the origin. The X-axis goes to
the right and the Y-axis goes *up* (not down). The Z-axis starts from the
screen and goes out to you. This isn't important for using Allegro
functions, but it is for OpenGL related functions. Screen coordinates are
evaluated as 'units', where 1.0 unit may be different on each axis
depending on the current modelview or projection matrix. We recommend
you have a look at the Red Book for further details.
2.4 Text and fonts
------------------
AllegroGL handles fonts and text differently than Allegro does.
Allegro fonts need to be converted to AllegroGL fonts using the
- FONT * allegro_gl_convert_allegro_font(FONT * f, int type, float scale)
function.
where type is one of:
- AGL_FONT_TYPE_DONT_CARE - font is either of the following...
- AGL_FONT_TYPE_BITMAP - font as a bitmap
- AGL_FONT_TYPE_TEXTURED - font as a textured quad
Look up the accompanying documentation for details.
- Fonts should be destroyed by using:
void allegro_gl_destroy_font()
To use textured fonts you must:
- glEnable(GL_TEXTURE_2D);
You can use the allegro_gl_printf function to draw AllegroGL fonts OpenGL
style. You can NOT use Allegro's textout and textprintf on AllegroGL
converted FONTs. Only regular Allegro FONTs work with the Allegro
function.
System fonts can also be loaded into AllegroGL. This method is depricated
and will eventually be removed.
2.5 The Mouse Cursor
--------------------
Allegro's functions for mouse management (show_mouse, set_mouse_cursor,...) can
be used while an OpenGL mode is set. However two cases should be considered :
1. You are using Allegro's GUI : the cursor is automatically drawn by the
GUI routines. You can manage your mouse cursor the same way you do with
Allegro.
2. You are not using Allegro's GUI : you have to use algl_draw_mouse() to
decide when the mouse cursor have to be drawn. In most cases, the best place
to call algl_draw_mouse() is just before allegro_gl_flip().
3.0 I just want OpenGL! Help!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Make sure you installed AllegroGL correctly. Refer to the readme.txt
file for detailed installation instructions
2. Add this code at the top of your file:
#include <allegro.h>
#include <alleggl.h>
3. Initialize AllegroGL by calling install_allegrogl() after allegro_init()
but before set_gfx_mode() or other AllegroGL or OpenGL commands.
4. Use set_color_depth() then set_gfx_mode(GFX_OPENGL, ...) to set up a
screen mode. If you need more control (like z-buffer depth), see the
documentation on the allegro_gl_set() function.
5. Use various OpenGL, Allegro or AllegroGL commands.
6. Link with AllegroGL and OpenGL libraries. Note that the link ORDER
MATTERS.
Those are:
For Mingw:
-lagl -lalleg -luser32 -lgdi32 -lopengl32 -lglu32
For MSVC:
agl.lib alleg.lib user32.lib gdi32.lib opengl32.lib glu32.lib
For Unix and Linux:
-lagl `allegro-config --libs` -lGL -lGLU
For DOS (Mesa):
-lagl -lalleg -lmesagl -lmesaglu
For Mac OS X:
-lagl `allegro-config --libs` -framework Carbon -framework OpenGL
7. Compile your program.
8. Rejoice!
Contact information
~~~~~~~~~~~~~~~~~~~
Web page: http://allegrogl.sourceforge.net/
Mailing list: allegrogl-general@lists.sourceforge.net
|