Today, I would not recommend anybody to go into graphics programming:
I started in 2001, when NVidias first Geforce 1 ("the Gigatexl shadercard") was first announced: The field developed since then with so much speed and innovations, it blows my mind of. Compared to what we could do 25years ago, the tech today is just fu*ing impressive.
Though, with this impressiveness comes a big "but": The space is developing at a speed which is really really scary. Nvidia came up with AI-based effects to influence scene & assets on their own - back then, we wouldnt have even thought about that this will be possible some day in realtime.
I do not know if its possible at all to be a "decent pro" in this field now - let me use other words: "Where is todays Jon Carmack?" - he was famous for squeezing everything out of the hardware, using ideas very hidden in the community etc. - today, there is not any competitive moat for people like him (he actually lives on his legacy), and that is because the field is so vast and evolving so fast that there is no chance to become the next one
If anyone needs a quick tutorial on linear algebra, you can check out this printabale four pager that I wrote: https://minireference.com/static/tutorials/linear_algebra_in...
I also have some notebooks with SymPy code examples here: https://github.com/minireference/noBSLAnotebooks
Somewhat surprising there is no mention of basic design principles, or understanding the quirks of human perception. My brother was a production artist for some well-known computer games in the '90s-'00s, and continually complained about programmers and managers with zero visual sense, or curiosity about understanding the artists' side.
Graphics aren't my specialty, but as a musician, sound designer and producer, by far the most effective/influential audio DSP coders I'm aware of understand the basics of music, the physics/acoustics of sounds, and the gotchas at the interface between discrete digital processes and how we perceive and interpret stimuli.
Here's my created list I maintain: https://legends2k.github.io/note/cg_resources/ Do learn if it piques your curiosity and have the time. You're in for a blast and a lot of learning, that'll make you a better engineer, in many other fields of computer science too (you understand hardware, system programming, programmer's machine model, etc.).
Don't learn if you do it with a monetary end goal as it's fleeting, ephemeral and not guaranteed in this day and age.
Should also include be under 25 and have lots of time to dedicate to it. I've always been interested in the idea of graphics programming and a few years ago I started teaching myself vulkan. Not sure quite how long I spent in total, 6 months of free evenings, maybe a bit less. I'm close to having a rendering framework. But it's one of those things where the further you get with it the more you realise how little you know. You feel like you're sort of happy with how things work and then you discover, no that's not the right architecture. I guess it's basically the mathematics of applied lighting. That's what your doing. The rest of it is the plumbing. Oops, why do my spotlights shine straight through the cube? Oh, I need to calculate shadows. Spend a couple of weeks working out how to get that into the render pipeline. But it is a lot of "fun" if you're into that sort of thing.
Depends on what you want to do.
If you just want to make a game, use a game engine like Unity, Godot or Unreal.
If you want to do graphics, like making engines, simulations, renderers then you should learn a low-level language and a graphics API. For the language I recommend C++, you can also use C or Rust but C might be a bit too difficult and you don't want to fight the language since graphics APIs are already hard. Rust might also be a good choice but I personally find the compile times very slow and the syntax to be ugly.
As for the API, go with OpenGL, it's cross-platform, old (which is good and bad at the same time) and is the easiest of them all.
learnopengl.com is by far the best tutorial on opengl, so I suggest following that.
After using opengl for a while you can branch out and use something like Vulkan or a graphics library that implements all of them, or even keep using opengl if its fine for you.
It's definetly not easy but it's one of the most fascinating parts of CS imo
I created and still maintain A-Frame (aframe.io). It’s been a gentle gateway to learn 3D graphics for a decade. Cool community if I can say so ha ha. Web is a great way to share stuff as you learn, collect feedback and get visibility. Many cases in the community of people that ended up doing 3d graphics professionally.
Feels like we try to turn anything we do into a career or job, especially with the odd ML angle. How about you "do graphics programming" instead of "being a graphics programmer"? Like start doing simple stuff until it clicks and you see it for being logistics to the GPU, then you can layer on top all the crazy concepts. Its like a small mountain you climb and suddenly everything clicks and you think like "oh my"... the possibilities and things to experiment with...
I just opened up that ray tracing tutorial and am slowly going through it, I've always been interested but never got around to it. Today I learned about the PPM image format, very accessible for this kind of thing! I mean writing a bitmap isn't rocket science but PPM is even easier.
I love @Animats comment!
I come from reading about CRDTs from Evan Wallace and also having built a product used by >40M users.
It applies to software products too!
In their words…
If you want to build products, use React or even vibecode; you will learn higher-level issues of solutions to problems (i.e. people problems rather than machine problems), not how to push data/state/computation around. The problem is solving a need.
Neither is good nor bad; just be clear about your goals and then it’ll be easy to decide if you want to follow Zynga’s cofounder, Jonathan Blow, or Notch! And before you rush to answer… consider whether any of them are happy.
For people who recommend against learning these skills because “what Carmack did is not possible anymore.”… well, if what you look for is money then yeah! But, if you just want to learn for the love of the game, then that would be a very bad advice!
I had some difficulties making sense of _color_ in context of graphics programming, especially transfer functions (sometimes misleadingly called tone mapping).
Good article on color management in general, which has a great intersection with foundations needed for graphics programming: https://chrisbrejon.com/cg-cinematography/chapter-1-color-ma...
I think that Khan Academy has a lot of graphics programmers that you might be interested in seeing. They use processing js. https://www.khanacademy.org/computing/computer-programming/b...
This guy has some good art: https://www.khanacademy.org/profile/kaid_1019042693170894950...
1. Familiarity with all GL APIs, but deep focus on 1 or 2.
If you want to work with Windows, probably DirectX.
2. Make awesome shaders. Check this out: https://fragcoord.xyz
I would say being a long-time user of Photoshop and Blender helps a lot. It's not a main tool, but supplemental. Maybe AI will take over some of this though.
Hell, maybe that other stuff too, hahaha!
trigonometry->Coordinate Geometry -> Linear Algebra applied to graphics
Once you have that intuition, the rest is all figuring out the stages of the graphics pipeline and the frameworks like opengl and their constituent data structures.
I still have a gripe over the fact The Book of Shaders which never gets finished [0].
Perhaps I'll write such a book... after I finish my game (dry laughter).
I think the advent of world models is going to open up a lot of interesting 3D applications with related graphics & rendering challenges. That intersecting with WebGPU general availability across browsers IMO makes graphics programming a very interesting domain to get into now. I certainly see the need in my dayjob.
I would learn both Claude and ChatGPT just to be safe.
white background makes this page unreadable for me
Graphics programming in games is like playing the guitar. It's cool, but everybody wants to do it.
Make the bold choice. Be a game network programmer. Nobody wants to do it, it's really hard and it kinda sucks.
Play the accordion :)
Is it okay if I only learn Python?
I’m not a graphics programmer but had alot of fun building a raycaster in C. Fun math and actually really simple relatively.
I’m going to revisit raycasting with a browser based raycaster from scratch.
I’m just finishing up a webgl + canvas game engine and game for a 2D top down grid strategy game first
For some reason, graphics is one of most popular topics for recreational programming.
My only additions to the article would be to study your probability/statistics (can't do efficient path tracing without it) and get comfortable with integrals, especially integrals on a sphere (physically based rendering will be a lot easier to understand).
My focus area in college was Computer Graphics. There is not enough focus about the math in this article, it just kind of passively mentions it. "Well you can get by with just a little bit of this and that" -- Linear Algebra is huge! So is an Engineering style Calculus course -- not your business calc. Those two require a year of their own to gain mastery. IMO, pick up:
Linear Alegbra Done Right Calculus Better Explained Concrete Mathmetics.
Then you can move on to the low level APIs.
[flagged]
[flagged]
I'm a graphics programmer.
The most useful resources I've found for graphics are scratchapixel, UC Davis' graphics lectures, songho's articles, and Essential Math for Games and Interactive Applications. I highly recommend you read this last resource front to back. Seriously, its the best freaking math reference for graphics out there.
But knowing theory is not sufficient. You also need to get your hands dirty by writing code: learn how to build a software rasterizer (check out Tiny renderer) and a ray tracer (Ray Tracing in One Weekend series). Preferably in a language like C++. Then move onto APIs. I recommend you learn OpenGL, but if you're okay with being confused as all hell try Vulkan. Or WebGPU if you're a hipster (/s).
Finally, try to build some stuff. A simple engine. A non-trivial technique. A game. Whatever.
Unfortunately, you're unlikely to get hired working as a rendering engineer without having serious connections, or by having adjacent experience in the industry. Doubly so now that everyone is convinced junior engineers are unnecessary.
Claude Code
Immutability. Semantics.
Do you want to make games, or do 3D engine programming?
If you want to make games, use an existing engine. Unreal Engine, Unity, Godot, and Bevy are good choices. You'll learn the higher level issues of graphics, not how to push pixels around. The real problem is making it fun.
If you want to do 3D engine programming, be aware that there are too many bad game engines. In Rust land, where I am, there are three failed renderers, one unfinished one, and the one inside the Bevy engine. Those are the major projects. There are many other "I'm going to build a game engine" projects. Building a game engine takes about two years to get to the My First Renderer point. Getting to big, highly detailed, dynamic scenes is a much bigger job. Be aware of the scale difference between the first demo and a useful engine.
If you want a job, be aware that the game industry sucks. Pay is lousy, hours are lousy, jobs end when the project is completed, and, like Hollywood, there's an army of wannabees wanting in. Also, right now, because of the collapse of the Metaverse thing, there's a glut of experienced people.
Then there's mobile. Everything is a cram job. Not enough screen, not enough compute, not enough GPU, not enough battery.
This is why most indy games now are 2D. That's do-able. Often in HTML/JavaScript.