I'm a software engineer and I'm hoping to move my career towards game development. I'm reading a book right now on 2D using C++/DirectX. When I get into 3D I know I want to do it correctly. For example, I know nothing about 3d space. So if I learn only an API I might know it but I don't know if I can develop an interractive mini 3d world with it. I wouldn't call myself successful just having a rotating crate with the latest shaders etc. My math skills are up to trig/linear algebra and still in college. I know more math is to come. Should I be reading on 3D theory books before picking up on OpenGL/Direct3D, or any other suggestions? I just know an API isn't going to teach 3D game development and don't want to be lost afterward. I'm very book-oriented so that's fine if there's suggestions there too. Thoughts are welcome. Thanks!
After dissing you on the other site I feel obliged to answer :)
I'm not any professional myself, but I did take a 3D Computer Graphics course in my university and it really helped me understand APIs I ended up using.
Among things I found especially useful:
- Transformation matrices and how they work, not only for object transformations but also for viewing transformation, perspective projection etc. That's probably the most important thing.
- The whole theory behind lightning and shadow, especially useful when you start dabbling into shaders.
- Texture sampling, mipmapping.
- Color theory and blending techniques is also useful.
And I definitely think that these are subjects that can be picked up from just reading a book or two on the subject, as long as you have the mathematical background.
Start by doing. That way you'll discover what you don't know.
Then pick up a good book on 3D math.
I recommend '3D Math Primer for Graphics and Game Development'
by Fletcher Dunn and Ian Parberry. (Wordware)
Very clear, to the point, relevant - with C++ code and all.
It's very important to know about the basics of points, vectors, transformations, etc.
But that does not mean you should study it all before diving in. :)
I took an Intro to Computer Graphics class in college (1-2 years ago) and the course website is still up. Lots of PowerPoint slides are still up that you might find useful and helpful. Topics cover both 2D and 3D graphics theory.
I'm in a similar boat to you (although I'm technically relearning stuff I vaguely knew in college), and my solution has been to check out several of the books mentioned over in the "Good 3D Math Theory Books" question here. If you're a book learner that may be a good way to go for you. Especially if your college doesn't actually have a good 3d graphics course (mine didn't).
Hmmm, when I had to make my first 3D game some 15 years ago (had to as it was my job, that helps persevering) I had no 3D knowledge whatsoever other than high school math. If you have a fondness for puzzle solving and reading up, you can reason most of it out yourself and with some help from the internet (comp.graphics.algorithms faq). I did read the openGL bibles and http://www.amazon.com/Computer-Graphics-Principles-Practice-2nd/dp/0201848406 (warning oldskool) as they give valid background info. If you do it this way you might start off the wrong way but at a point you'll either dream up, or bump into, a better solution. Most of the 3d problems can be solved if your 2d grasp is good. Add to the general trig, pythagoras, matrices and inverses/transpose (for projection), dot&cross product and what you use em for, quaternions (don't have to understand em, just know how to use them - you can do without but they are nowadays part of the basic vocabulary), and you can solve most problems you come across. As you go you'll bump into better ways, but those few can solve anything. The best way is to set yourself a goal outside your grasp and force yourself to get there. The problems you run into are what you need to learn, and hey, you're on the site where they can help you solve em!
The Wolfire Games blog has had a really excellent series of tutorials on linear algebra for game developers recently.
- Part 1 - Vectors and vector math
- Part 2 - Length, distance, normalization, dot and cross products
- Part 3 - Basis vectors and matrices
- Part 4 - 2D and 3D rotations
It really is important to understand the math behind it before you bother starting to learn an API. Otherwise, the order and purpose of the API calls won't make a whole lot of sense to you. You need to understand what they're doing for you on a math level first.
I suggest you enroll at Game Institute, specifically the Graphics Programming with DirectX 9 courses.
You don't need to take part in the interactive classes if you just want to self-learn.
By the way, there is an option to also get printed books for a very low additional amount. They are well worth it.
I did a lot of their courses a few years ago and the courses, although a little old-skool are really quite good and I can't recommend them highly enough - plus Gary Simmons is a really nice guy.
Above all else just try to make stuff. First and foremost jump in. Otherwise you will become an expert at theory but not practice.
If you think that you are truly passionate about graphics, then imagine that you will continue to learn new material most of your life. Its not like you can learn everything you need before you start. It just doesn't work that way.
As you learn more and more about the mathematics of 3D graphics, you will realize that there is no mathematics of computer graphics, there is only math. Learn how to teach yourself mathematics on your own. Then you will be able to digest new techniques as they are presented in literature.
As graphics technologies evolve we will borrow different mathematic techniques. What is popular today might not be popular tomorrow.
Here are some things that are going to stay the same.
Right now I am finding the material in Geometric Algebra for Computer Science very interesting, and think that it might be better to start with the approach they layout for computer graphics. http://www.amazon.com/Geometric-Algebra-Computer-Science-Object-Oriented/dp/0123694655
The book explains things like quaternions in a much simpler way, and might be helpful for you depending on your mathematical background and interests.
Don't go for "computer graphics" books. Start with linear algebra - it lays the foundation for everything you need. MIT has a good video course: http://ocw.mit.edu/courses/mathematics/18-06-linear-algebra-spring-2005/
From there, it should be straight forward to pick up any introductory text on computer graphics. UoWashington has a course online (no video, though): http://www.cs.washington.edu/education/courses/457/06au/lectures/
If you're impatient you can start with the graphics course without linear algebra, but believe me when I say it will come back to bite you :)
If you want to understand how a traditional software rendering pipeline works (and things haven't changed that much even with the introduction of programmable hardware pipelines), one book I'd definitely recommend would be Jim Blinn's: A Trip Down The Graphics Pipeline.
Unlike some of the other suggestions, it's not particularly comprehensive, but it is very readable and I think if you're just getting started with 3D, it's a good introduction. And it's written by Jim Blinn, who is one of the founding fathers of computer graphics, and thus is written from the perspective of someone who actually invented/discovered these techniques.
I was the TA for the graphics course at my university for several years. I set the syllabus, and covered things like software rasterizations and shading, Java3D, OpenGL, etc. Some time after this, in my own time I decided to write a ray-tracer for my own edification. This was an incredible experience - with a frame buffer and a putpixel(x,y, color) routine, in 500 lines I had code to generate an image with spheres, triangles, per-pixel shading, shadows, etc. If I had to redo the pracs for the courses, I would insist that the students do a ray-tracer. It is way to easy to get caught up in the details of a scanline algorithm when building a rasterizer, or feel like you're working through a black box using a 3D API.
For quick, solid access to a graphics sandbox, I recommend writing your own ray-tracer. Obviously, this is a far cry from what is commonly used in production real-time 3D graphics, but it is a really intuitive and compact way to see and learn the theory.
I'm currently doing the same as you, and found CSCI 234 Introduction to Computer Graphics on iTunesU to be really helpful after I read a few books on computer graphics and math.