Howto: 2D in DirectX Questions

Started by
3 comments, last by Ravyne 11 years, 3 months ago

Hi, I have some questions. I'm not sure if I understood it right so I tell you how I understood it and if its wrong you maybe can correct me.

If I want to write a 2D game in DirectX:

- I fix the camera on the Z-Axis and move just on the X,Y

- I draw primitives (a quad for example) and then just map the 2D texture on it

- that's basically how the whole scene is created. Just quads mapped with a texture(?!)

Is this the common way?

I know that there is Spritebatch for DirectX, but because it's just for me and on the purpose to learn something I want to do it all by my own.

Regards

from time to time i find time

Advertisement

For a 2D game with Direct3D you need an orthogonal projection matrix, so z-axis is disabled in projection.

To draw a sprite you can either draw a quad with a texture or create the quad within a geometryshader.

For rotation, scaling,... you can modify your modelmatrices.

An alternative is Direct2D, where you can "draw like in MSPaint". You can also draw rectangles with bitmaps to use it as sprites. The API also provides opacity and mask so you can stencil out e.g. the character-sprites. And you can rotate, zoom etc with easier matrix-manipulations.

Maybe Direct2D is a better start to get into the world of 2D and advance to D3D afterwards.

But do I have the same "power" as in Direct3D? All the shader stages (maybe to tessellate the 2D texture and give it a 2.5D look)?

from time to time i find time

For a 2D game with Direct3D you need an orthogonal projection matrix, so z-axis is disabled in projection.
To draw a sprite you can either draw a quad with a texture or create the quad within a geometryshader.
For rotation, scaling,... you can modify your modelmatrices.

An alternative is Direct2D, where you can "draw like in MSPaint". You can also draw rectangles with bitmaps to use it as sprites. The API also provides opacity and mask so you can stencil out e.g. the character-sprites. And you can rotate, zoom etc with easier matrix-manipulations.

Maybe Direct2D is a better start to get into the world of 2D and advance to D3D afterwards.
The Z axis isn't disabled by the projection the just map to the same location on the screen is all. and Z values still affect if an object is in front of another one. And you can still render full 3D models with an orthographic projection the projected image however doesn't have any depth queues embedded in the image.

Effectively all a projection does is take how something looks in a certain space(1D, 2D, 3D, 4D, ...) and transform this into an other space(1D, 2D, 3D, 4D, ...) and show what it looks like in that. During the projection you can lose some information but this doesn't mean that the information in the original space doesn't affect the result of the projection.

For a long time using 3D to do 2D stuff was the only way to go with DirectX as the hardware was faster doing the 3D transformations than doing the 2D ones.

Worked on titles: CMR:DiRT2, DiRT 3, DiRT: Showdown, GRID 2, theHunter, theHunter: Primal, Mad Max, Watch Dogs: Legion

Direct2D isn't really meant for this kind of 2D graphics, and it is, in fact, just a layer on top of Direct3D. Direct2D was created more of vector-style drawing and glyphs (text and such), than bitmap graphics. Its primary purpose was to serve as the basis of DirectWrite.

Direct3D with orthographic projection is the way to go. The projection will eliminate perspective, but you can still use the z-axis as a way to order draw calls, and eliminate redundant pixel shader calculations by drawing front-to-back. This also gives you unfettered access to the full capability of Direct3D.

throw table_exception("(? ???)? ? ???");

This topic is closed to new replies.

Advertisement