2d particle question


I’m just starting out on Zelda:TP on the Wii. It’s an impressive game so far with obvious potential as the plot and story really are starting to pick up steam. But before I get on another obscure tangent I want to talk about a recurring question I have. Why do games do some graphical things well and other graphical things poorly?

In Twlight Princess, you run into a being made of light. I’ll spare the story but you can see it in the picture to the right. It’s essentially a glowing thing that radiates little rings of rainbows and golden rays. The imagery is spectacular and very impressive for the Wii’s hardware capability. So why does that look great but polygons and textures look so weak?

As far as I know, creating a light ray is easier in terms of programming than creating a 3d object that takes up space. A light ray or glow is simply a 2d texture with a possible alpha channel that blends with whatever is near it. 2d textures are easy with modern hardware so developers can throw a bunch of them on the screen. When thousands of them all blend together, various unintentional shapes happen naturally.

For example, here’s a very spread out series of 2d textures from a particle engine.

And here is another example with the particles emitting very close to themselves. Good for flame effects.

As I was saying, the shape emerges by itself and isn’t really explictly created. The particles create enough chaos that maybe an illusion of complexity is there. I’m not sure. My point is, for a long time 2d tricks like these have been of higher quality than of struggling 3d polygon scenes. This is especially evident on the Wii, which to many is weak on hardware power. So why do scenes with this light being look great? Why have particle effects always been impressive (to me)?

Wanting to get someone else’s (more experienced) input, I posted this to Google Groups:

Way back in 1993, the best part of the unreal demo was a section called “shadebobs”. It’s an alpha blending and color rotation trick (afaik) and it came off really nicely. Similarly, even simple 2d particle engines(like NeHe’s #19) are really good even on older hardware.

Then recently, when playing Twilight Princess, I came across a scene where light beams are all over the place. They had little rainbow 2d textures floating around (with high alpha values for a transparency effect) and many light particles spewing out (which appeared to be 2d textures). Even on the lightweight Wii hardware the effect was convincing.

So I finally have to ask this very general question.

Why? Why are light tricks so easy? Is it a natural function of alpha blending with many 2d textures (easy on hardware)? Is it a derived effect (shadebobs appear to combine together but it’s not an explicit effect, it just happens)?

In NeHe’s tutorial, there are no visible edges because the 2d texture he is using has been created with a perfect dither to 0. Is this maybe another part of the answer? A graphics application has already computed the smoothness/alpha and so the load is less? Even on older hardware, the dithering is perfect. The effect is convincing. You can press your face up against the screen and see no edges, you can see wonderful curves and strange shapes out of shadebobs that are probably unintentional. On the flipside, a completely intentional 3d scene is full of jaggies and straight lines. Curves are harder with polygons. FSAA is expensive.

So is this common sense? Obviously you can’t make a 3d scene out of 2d textures. Spinning and interacting with a 2d particle engine isn’t very convincing once you try to fly around it. The effect is limited I suppose. So maybe 2d alpha tricks are easy and limited in use. Or, maybe video cards are just really good at alpha blending?

1 Comment so far
Leave a comment

1

My iPhone likes this blog. Nuff said.



Leave a comment
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>