DirectXTutorial.com
The Ultimate DirectX Tutorial
Lesson 2:  More About Sprites
Log In
Lesson Overview

In the last lesson we drew a simple sprite.  However, if you did the exercises, you would have found that this was quite limited a tool.  In this lesson we will look into additional things we can do with sprites to make them more usable in a game display.

More specifically, we will learn how to do transparency with textures, in addition to making semi-transparent sprites for cool display effects.

Color-Keys

In case you haven't studied color-keys before, a color-key is a single color in a texture which always appears invisible (a.k.a. doesn't actually appear at all).  In short, it eliminates the annoying black border around the images drawn.

If you think back to the Direct3D Basics Tutorial, you might recall advanced texture handling.  The first of these lessons (Lesson 12) covers the color-key in textures applied to 3D objects.  However, sprites also use textures, and if you load a texture with a color-key, and apply it to a sprite, the same effect results!

I will not re-cover the function here.  If you wish to review it, look at Lesson 12 in the Direct3D Basics Tutorial, which covers color-keys specifically, or look in the documentation at D3DXCreateTextureFromFileEx() for the full function description.

Alpha Blending with Sprites

However, there is another element which I have not covered yet, but which is quite simple.  Remember this?

d3dspt->Begin(NULL);    // begin sprite drawing

This is the function called when you are ready to draw sprites.  However, to use color-keys, we need to add a flag into that single parameter.  The flag we will use is D3DXSPRITE_ALPHABLEND, making the command look like this:

d3dspt->Begin(D3DXSPRITE_ALPHABLEND);    // begin sprite drawing with transparency

Adding this flag allows us to draw sprites both with color-keys and with semi-transpancy.

Using Color-Keyed Textures

Instead of explaining everything about color-keys all over again, I am simply going to show you an example of using color-keys with sprites.  We will take the finished program form the last lesson and allow the image to use a color-key.

The image in the last lesson's program would have looked like this if we had given it a colored background:

Image 1.1 - DirectGrid.png Displayed in DirectX

Image 2.1 - Panel1.png Displayed Against a Colored Background

This just won't do.  To load the texture with a color-key, we have to do this:

D3DXCreateTextureFromFileEx(d3ddev,    // the device pointer
                            L"Panel2.png",    // the new file name
                            D3DX_DEFAULT,    // default width
                            D3DX_DEFAULT,    // default height
                            D3DX_DEFAULT,    // no mip mapping
                            NULL,    // regular usage
                            D3DFMT_A8R8G8B8,    // 32-bit pixels with alpha
                            D3DPOOL_MANAGED,    // typical memory handling
                            D3DX_DEFAULT,    // no filtering
                            D3DX_DEFAULT,    // no mip filtering
                            D3DCOLOR_XRGB(255, 0, 255),    // the hot-pink color key
                            NULL,    // no image info struct
                            NULL,    // not using 256 colors
                            &sprite);    // load to sprite

If we use the D3DXSPRITE_ALPHABLEND flag and replace the D3DXCreateTextureFromFile() function with this code, we will instead get this result:

Image 1.1 - DirectGrid.png Displayed in DirectX

Image 2.2 - Panel2.png Displayed with Alpha 

Well, at least that looks mildly appropriate for a game.  Let's make it even better!

Semi-Transparency

If you look at the DirectXTutorial layout from an artistic viewpoint you can imagine that it is probably supposed to be semi-transparent, meaning that if an object were to appear behind it, it would still be somewhat visible, like this:

Image 1.1 - DirectGrid.png Displayed in DirectX

Image 2.3 - DirectX vs DirectXTutorial

This is a very powerful effect, and is key in making a good game display.

The way to create this effect is extraordinarily simple.  All we need to do is include alpha into the function Draw(), like this:

d3dspt->Draw(sprite, NULL, &center, &position, D3DCOLOR_ARGB(127, 255, 255, 255));

This makes the sprite appear 50% blended with the background.  If we did this, the image would be shown like this:

Image 1.1 - DirectGrid.png Displayed in DirectX

Image 2.4 - The Panel Drawn with Semi-Transparency 
The Finished Program

Let's take the last lesson's program and make the image appear semi-transparent and eliminate the black border.  Then let's look at how it might be if the background color changed continuously.

[Show Code]

For this example you will need the new version of the Panel, called "Panel2.png".  The only difference is that the background is hot pink.  If you really can't stand this color, then just change the image and the code to have a different color-key.

If you add the new image and run the code, you will get something like this:

Image 1.1 - DirectGrid.png Displayed in DirectX

Image 2.5 - Panel2.png Displayed With Transparency
Summary

Now we are starting to get somewhere with sprites.  However, even this isn't all there is to it.  These two techniques are vital necessities for creating good game displays, and you should become well-practiced with them.  As usual, I recommend doing these exercises before moving on:

1.  If you know how, create a 3D model and draw it behind Panel2.
2.  Change the semi-transparency to 75% transparent.  Now 45%.
3.  Make the blue border fully opaque, but leave the rest transparent (Hint: make it into two sprites).

Up next, we have an exciting lesson.

Next Lesson:  Animation

GO! GO! GO!