NeHe Productions: OpenGL Lesson #15Date de publication : 31/03/2006 , Date de mise à jour : 31/03/2006
Par
Jeff Molofee ( NeHe ) (Autres articles)
Lesson: 15 After posting the last two tutorials on bitmap and outlined fonts, I received quite a few emails from people wondering
how they could texture map the fonts. You can use autotexture coordinate generation. This will generate texture
coordinates for each of the polygons on the font.
A small note, this code is Windows specific. It uses the wgl functions of Windows to build the font. Apparently Apple
has agl support that should do the same thing, and X has glx. Unfortunately I can't guarantee this code is portable.
If anyone has platform independant code to draw fonts to the screen, send it my way and I'll write another font tutorial.
We'll build our Texture Font demo using the code from lesson 14. If any of the code has changed in a particular
section of the program, I'll rewrite the entire section of code so that it's easier to see the changes that I have made.
The following section of code is similar to the code in lesson 14, but this time we're not going to include the
stdarg.h file.
We're going to add one new integer variable here called texture[ ]. It will be used to store our
texture. The last three lines were in tutorial 14 and have not changed in this tutorial.
The following section of code has some minor changes. In this tutorial I'm going to use the
wingdings font to display a skull and crossbones type object. If you want to display text
instead, you can leave the code the same as it was in lesson 14, or change to a font of your own.
A few of you were wondering how to use the wingdings font, which is another reason I'm not using
a standard font. Wingdings is a SYMBOL font, and requires a few changes to make it work. It's
not as easy as telling Windows to use the wingdings font. If you change the font name to wingdings,
you'll notice that the font doesn't get selected. You have to tell Windows that the font is
a symbol font and not a standard character font. More on this later.
This is the magic line! Instead of using ANSI_CHARSET like we did in tutorial 14, we're going
to use SYMBOL_CHARSET. This tells Windows that the font we are building is not your typical
font made up of characters. A symbol font is usually made up of tiny pictures (symbols). If
you forget to change this line, wingdings, webdings and any other symbol font you may be trying
to use will not work.
The next few lines have not changed.
Now that we've selected the symbol character set identifier, we can select the wingdings font!
The remaining lines of code have not changed.
I'm allowing for more deviation. This means GL will not try to follow the outline of the font as
closely. If you set deviation to 0.0f, you'll notice problems with the texturing on really curved
surfaces. If you allow for some deviation, most of the problems will disappear.
The next three lines of code are still the same.
Right before ReSizeGLScene() we're going to add the following section of code to load our texture. You
might recognize the code from previous tutorials. We create storage for the bitmap image. We
load the bitmap image. We tell OpenGL to generate 1 texture, and we store this texture in texture[0].
I'm creating a mipmapped texture only because it looks better. The name of the texture is lights.bmp.
The next four lines of code will automatically generate texture coordinates for any object we draw
to the screen. The glTexGen command is extremely powerful, and complex, and to get into all the
math involved would be a tutorial on it's own. All you need to know is that GL_S and GL_T are
texture coordinates. By default they are set up to take the current x location on the screen and
the current y location on the screen and come up with a texture vertex. You'll notice the objects
are not textured on the z plane... just stripes appear. The front and back faces are textured though,
and that's all that matters. X (GL_S) will cover mapping the texture left to right, and Y
(GL_T) will cover mapping the texture up and down.
GL_TEXTURE_GEN_MODE lets us select the mode of texture mapping we want to use on the S and T
texture coordinates. You have 3 choices:
GL_EYE_LINEAR - The texture is fixed to the screen. It never moves. The object is mapped with
whatever section of the texture it is passing over.
GL_OBJECT_LINEAR - This is the mode we are using. The texture is fixed to the object moving
around the screen.
GL_SPHERE_MAP - Everyones favorite. Creates a metalic reflective type object.
It's important to note that I'm leaving out alot of code. We should be setting the GL_OBJECT_PLANE
as well, but by default it's set to the parameters we want. Buy a good book if you're interested
in learning more, or check out the MSDN help CD / DVD.
There are a few new lines at the end of the InitGL() code. BuildFont() has been moved underneath our texture loading
code. The line glEnable(GL_COLOR_MATERIAL) has been removed. If you plan to apply colors to the texture using
glColor3f(r,g,b) add the line glEnable(GL_COLOR_MATERIAL) back into this section of code.
Enable 2D Texture Mapping, and select texture one. This will map texture one onto any 3D object we draw to the
screen. If you want more control, you can enable and disable texture mapping yourself.
The resize code hasn't changed, but our DrawGLScene code has.
Here's our first change. Instead of keeping the object in the middle of the screen, we're going
to spin it around the screen using COS and SIN (no surprise). We'll translate 3 units into the
screen (-3.0f). On the x axis, we'll swing from -1.1 at far left to +1.1 at the right. We'll
be using the rot variable to control the left right swing. We'll swing from +0.8 at top to
-0.8 at the bottom. We'll use the rot variable for this swinging motion as well. (might as well
make good use of your variables).
Now we do the normal rotations. This will cause the symbol to spin on the X, Y and Z axis.
We translate a little to the left, down, and towards the viewer to center the symbol on each axis.
Otherwise when it spins it doesn't look like it's spinning around it's own center. -0.35 is just
a number that worked. I had to play around with numbers for a bit because I'm not sure how wide
the font is, could vary with each font. Why the fonts aren't built around a central point I'm
not sure.
Finally we draw our skull and crossbones symbol then increase the rot variable so our symbol
spins and moves around the screen. If you can't figure out how I get a skull and crossbones
from the letter 'N', do this: Run Microsoft Word or Wordpad. Go to the fonts drop down menu.
Select the Wingdings font. Type and uppercase 'N'. A skull and crossbones appears.
The last thing to do is add KillFont() to the end of KillGLWindow() just like I'm showing below. It's important to
add this line. It cleans things up before we exit our program.
Even though I never went into extreme detail, you should have a pretty good understanding on how
to make OpenGL generate texture coordinates for you. You should have no problems mapping textures
to fonts of your own, or even other objects for that matter. And by changing just two lines of code,
you can enable sphere mapping, which is a really cool effect.
Jeff Molofee ( NeHe )
|
Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2006 Nehe Gamedev.net. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.