Question

I saw that D3DX9 is not recommended by Microsoft and not shipped with Windows SDK. I would like to adopt.

I'm missing my line drawing utility.

How can I replace ID3DXLine and ID3DXFont in "new" DirectX9?

Was it helpful?

Solution

Generally, lines and fonts are sprites. ID3DXLine and ID3DXFont use ID3DXSprite interface under the hood. (Of course, there are other options too, but sprite approach is the most widely used)

Drawing sprites

So, firstly, you will need either 3rd party or your own sprite renderer. Typically, development of "bedroom" sprite engine, consists of stages:

  • drawing bunch of simple colored quads (two triangles forming rectangle). There are different techniques, but even simplest "all-in-one vertex buffer" approach is not so bad. More advanced techniques includes instancing, point sprites, geometry shader and tessellation tricks (last two are not applicable in DX9). But don't even try to draw million sprites with million draw calls ;)
  • Texturing those quads. You will need bitmap loader. If you don't want to use D3DX at all, you can pick open-source FreeImage library for example, of write your own loader.
  • optimizing rendering using batching. Sort your sprites, to minimize draw calls number and/or minimize context state changes.
  • optimizing texturing using texture atlases. You will need to solve rectangle packing algorithm (there are already plenty of implementations on web, or pick up you math book) and roll out some kind of texture atlas format.

You can choose on what stage you stop. Later, you can go back and continue.

Drawing lines

Then, for straight lines, you will simply draw a thin rectangular sprite. User will input values such as beginning, end and thickness of line, and you will need to do some simple math to calculate position and rotation of this sprite. Sprite can be just colored or have a texture: for dotted lines, stripped lines, lines with pink fluffy kittens etc. Then, you can implement curved lines as a set of straight lines. You can optionally add sprites to the ends of line, such as arrows.

Drawing text

For text, things can be very complicated (and I will tell only about sprite fonts here):

  • each character is a little sprite
  • you draw texture of a letter over it
  • you have a texture with those letters, and sample it using dictionary. Dictionary is a map of character (or character code) to texture coordinates where it's picture situated, along with additional info, such as spacing, kerning, etc.
  • you can have pre-baked (offline) texture atlas with all letters of all fonts of all font sizes you need, along with dictionary. Obviously you cannot have all letters of all languages on a planet in your resource cache.
  • you can bake each character as needed on runtime and add it to your cache (texture atlas + dictionary)

To get characters from font file such as .ttf to a bitmap (image) you can use library. FreeType is a best open-source I know. Parsing fonts yourself can be... complicated.

You can then mix all together and draw lines with text texture. Or draw text surrounded by frame of lines. Or sprite with a text above it. Or GUI. All those stuff will be the sprites.

...or just not bother

If you still using DirectX 9, do you really need to bother with Windows SDK, removing D3DX stuff? Maybe you can continue developing with Direct SDK and D3DX if it works for you? Note, that if, for some reason, you'll decide to move to DX11, there are DirectXTK, which partially replaces D3DX11 stuff. Still, your own, or 3rd party solution will probably be more flexible and suitable for you. There are many others applications of sprites in 3D graphics,, such as billboarding, GUI, particles, etc. And as always, reinventing the wheel is a much fun and positive experience ;)

Hope it helps. Happy coding!

OTHER TIPS

Why not try and use DirectX 11?

Oterhwise OpenGL is supported on almost any platform.

I would recommend trying SDL it has helper methods for most 2D stuff you can imagine.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top