Free Web Hosting Provider - Web Hosting - E-commerce - High Speed Internet - Free Web Page
Search the Web

vbProgramming | Tutorials | Direct3D | Transparent Sprites
    vbProgramming 
Tutorials -
Transparent Sprites
 
     

vbProgramming Home :: vbProgramming Forums :: Tutorials :: Contact :: Links 

 

 

Title says it all - time to make the stupid green background transparent!

Intro
This tutorial will be based off of the previous tutorial (Matrices and Transformations). So open up the project from that (you can download the source code at the forums if you wish).  This tutorial will be very brief, and we'll only be working with clsSprite.

Getting Started
Open up the source code from the Matrices and Transformations tutorial. I'll be very brief in this tutorial as most of it is pretty simple.

In clsSprite's globals:
'This variable will store if the image is Transparent or not
Dim IsTransparent As Boolean


Change the arguments for Public Sub New of clsSprite:
 Public Sub New(ByVal lDevice As Device, ByVal ImageName As String, ByVal TopLeft As Point, ByVal Width As Integer, ByVal Height As Integer, Optional ByVal Transparent As Boolean = True)


I don't think you guys have learned Optional arguments yet.  Here's what it is. There are some arguments for a function which you type frequently and you don't want to bother wasting time typing. Specifying an Optional argument means, when you call your function - you don't have to use that argument, a default value is provided there. Most of our sprites will be transparent, so we might as well make them transparent by default without having to specify True for the last argument New Sub... understand? It's easier than you think :).

Now add this line to the beginning of the New sub:
IsTransparent = Transparent

Pretty easy so far, it just stores the variable IsTransparent. Now let's modify the Load sub. Add this line after declaring Vertices():

'This value will store our color that is to be made transparent.
'That color is: Fully Visible (indicated by the first argument)
'and fully green (third argument).
'Basically, our color is LimeGreen (255,0,255,0).

Dim ColorKeyVal As Color = Color.FromArgb(255, 0, 255, 0)
'LimeGreen

Now replace this block with the line that says SpriteImage = TextureLoader.FromFile(dxDevice, ImageName):
 'If our image is transparent Then.
If IsTransparent Then
'The following arguments require a somewhat advanced knowledge of Direct3D. So I really don't
'know what most of them do.
SpriteImage = TextureLoader.FromFile(dxDevice, ImageName, 32, 32, D3DX.Default, 0, Format.Unknown, Pool.Default, Filter.Point, Filter.Point, ColorKeyVal.ToArgb)
'Arguments from left to right:
'Device, ImageName, Width, Height, MipLevels (Honestly I don't know what this is... so I use default ;P).
'Usage (this is something advanced, so we leave it alone and say 0; use 0 when unsure of anything in Direct3D).
'Format: Heh, instead of guessing the image format (8-bit, 16-bit, 24-bit...etc) and hardcoding it for each image that you have,
'just use Format.Unknown and let d3d figure it out.
'Memory Pool: Let d3d handle the memory stuff, so say defualt.
'Filter & Mip Filter - They affect how the image is rendered. Filter.Point is the clearest and is NOT good if your image is pixilated.
'Try changing both the Filter.Points to Filter.Triangle, you'll get a slightly more blurrier image,
'but it adds a nice "warm" effect. Just mess around with the Filter arguments until you get one that works for you. I use Points for
'clearer images, and Triangle for images that appear to be pixilated and require 'blending'
'Finally, the Color to be made transparent

Else
'Set our SpriteImage
SpriteImage = TextureLoader.FromFile(dxDevice, ImageName)
End If

Lots of green ^^. Everything that I know about that line is written right there.

Now let's jump to the Render sub. At the very beginning, do this:

 'If the sprite is Transparent, then
If IsTransparent Then
'Enable AlphaBlending. The process of mixing a pixel's color + it's inverse color.
dxDevice.RenderState.AlphaBlendEnable = True
'A Pixel's color + it's inverse color is a "transparent color"
'Not fully understanding how this works, all I can really tell you is
'that whenever it sees the transparent color (LimeGreen), it
'overlays it with its inverse color, and makes the LimeGreen transparent.

dxDevice.RenderState.SourceBlend = Blend.SourceAlpha
dxDevice.RenderState.DestinationBlend = Blend.InvSourceAlpha
End If


The process of Alphablending makes a pixel transparent. You're simply making LimeGreen transparent by using those flags. I honestly do not understand what they mean. If anyone has any information whatsoever, please post on the forums. Thank you.

Ok, alphablending takes up a lot of memory, so, disable it when you're done. At the very end of the Render sub:
'Alphablending takes up a LOT of memory, so just disable it when you don't need it.
dxDevice.RenderState.AlphaBlendEnable = False

Run the program, the (2) sprites should be transparent! Sorry for the lack of explanation, this is something which I don't understand a lot about. Next up: "World Space vs Model Space." Now that is something which I do understand pretty well! So you'll have a lot of explanation going on there.


The Source Code for this tutorial is located here: You can also locate this by logging in to vbProgramming Forums and going to:
Tutorials > Tutorial Source Code > Source Code