Skip to content

This is a project with a sole purpose of reminding myself of what I need to learn in order to become a graphics engineer.

License

Notifications You must be signed in to change notification settings

FAWWST/GraphicsProgrammingRoadmap

Β 
Β 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

67 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

My Computer Graphics Programming Roadmap

This project's sole purpose is for me to remind myself of what I need to do in order to become a graphics engineer. If you plan to use this for yourself please take some time to read the sections of each stage in this graphics programming roadmap, to make sure it fits with what you want to do! I might also make the same roadmap on my Website WIP.

VERY IMPORTANT NOTE! Since this repository is gaining some stars, I feel the need to address the fact that this roadmap is how I plan to venture through graphics programming AS A LEARNER, I AM NOT an already established expert in the field! So for this reason you might actually prefer this over other roadmaps as we are both learners(?)! Anyways these graphics roadmaps are pretty much very close/the same.

In order to not waste your time, I want to say that graphics is heavy in mathematics & computer science, and is very punishing to people that dont bother with the math! If you are a person that hates & doesn't like math, then graphics engineering probably isn't for you, but if you like math but see it as difficult you can become a graphics engineer with enough effort! Additionally later on if you dont like graphics engineering anymore & want to do something still related but is more lenient in the math section, you can become a technical artist instead! (This role is still challenging but much more fun!) Technical Artist roadmap when? I will maybe make one later...

Finally, if I make a spelling/grammar mistake feel free to make a pull request.

πŸ₯³ Thank you all for the 25 stars/support achieved on 8/23/2024! πŸ₯³

Contents

  1. Roadmap start & Graphics advice from professionals
  2. Math & C++
  3. Raytracing
  4. Software Renderer
  5. Graphics Specialization
  6. Diving Deep
  7. Miscellaneous Notes & Life Advice
  8. My personal progression with graphics!
  • Firstly, Learn the Math it's the one and only thing important, especially when it comes to graphics programming. Even more so than C++. Learn it to the point where you can understand almost exactly what is happening, because if you do, you will have an easier time in everything, from problem-solving to debugging, & etc, especially in the future.

If you are not interested in my personal advice before starting graphics engineering (I suggest you continue reading since I am a learner like you!), skip to the graphics advice of professionals by clicking here or start the graphics pre-requisites section by clicking here.


Advice from me after I did some graphics projects!

  • After doing some graphics, I realized math is insane and beautiful... and really fucking hard. Additonally, slowly try to learn some math notation when you are bored, since graphics concepts (especially on wikipedia) are mostly shown in ugly and scary math symbols. Example: Do you know what sigma or product do & what they look like? What does the cross product and dot product do/look like? Integrals??? Rendering equation?!?!? What the fuck is Calculus??? πŸ—£πŸ—£πŸ—£πŸ”₯πŸ”₯πŸ”₯

Jokes aside, here are some answers to the previous questions:

$$\large \sum_{sigma}^{im} | \prod_{product}^{im} | \int_{integral}^{im}$$

$$\large Rendering \ Equation\Rightarrow L_o(\mathbf{x}, \omega_o) = L_e(\mathbf{x}, \omega_o) + \int_\Omega f_r(\mathbf{x}, \omega_i, \omega_o) L_i(\mathbf{x}, \omega_i) (\omega_i \cdot \mathbf{n}) , d\omega_i$$


An example of what you will see on wikipedia! (Literally STOLEN from wikipedia btw!)
Try to guess what this is if you have done some game development previously! Spoilers below!

Click here to reveal the answer! Rotation Matrix! Rotating around Z then Y then X!

$$ \large R = R_{z}(\gamma) , R_{y}(\beta) , R_{x}(\alpha) = \begin{bmatrix} \cos \gamma & -\sin \gamma & 0 \\ \sin \gamma & \cos \gamma & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} \cos \beta & 0 & \sin \beta \\ 0 & 1 & 0 \\ -\sin \beta & 0 & \cos \beta \\ \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos \alpha & -\sin \alpha \\ 0 & \sin \alpha & \cos \alpha \\ \end{bmatrix} $$

$$ \large = \begin{bmatrix} \cos \beta \cos \gamma & \sin \alpha \sin \beta \cos \gamma - \cos \alpha \sin \gamma & \cos \alpha \sin \beta \cos \gamma + \sin \alpha \sin \gamma \\ \cos \beta \sin \gamma & \sin \alpha \sin \beta \sin \gamma + \cos \alpha \cos \gamma & \cos \alpha \sin \beta \sin \gamma - \sin \alpha \cos \gamma \\ -\sin \beta & \sin \alpha \cos \beta & \cos \alpha \cos \beta \\ \end{bmatrix} $$


An example of Sigma being used, in a VERY popular math operation! (Literally STOLEN from Google btw!)
Again! Try to guess what this formula is being used in! Spoilers below!

Click here to reveal the answer! Dot Product! Images from Google & Nvidia CG

$$ \large ? = \sum_{i=1}^{n} a_i b_i $$


START OF THE GRAPHICS ROADMAP, THE ORDER IS IMPORTANT & IT'S OKAY TO DEVIATE BUT NOT TOO FAR FROM EACH INDEX.

You can skip this as I list my resources in order according to many sources when it comes to learning CG

As I said previously, math is THE most important section of all graphics, Good Luck!
Learn these 3 topics > Linear Algebra, Trigonometry, C++.

  • MathIsFun.com Trigonometry For Learning Trigonometry & MathIsFun can be used to learn almost everything needed!
  • Immersive Mathemathics, Learn math needed through a website that shows mathematics in an immersive 3D environment.
  • Essence of linear algebra Learning Linear Transformations, & see how they move in space via video (3blue1brown).
  • Cherno C++ Series Chernos C++ Series for the pre-requisite section (Video Format)
  • Learn CPP Website Learn C++ website, literally everything covered (Reading Format)
  • Scratchapixel You can learn all math prerequisites in here (Geometry Section) & other computer graphics topics!

First graphics project will be simple raytracing! (Basically 1 math formula, understand it!)
All resources below will cover the math & implementation, pick your poison.

  • Cherno Raytracing Series (REAL TIME RAYTRACER) Cherno Raytracing Guide that im following.
  • Raytracing in 1 Weekend (OFFLINE RAYTRACER) Infamous book for learning raytracing.
  • Scratchapixel, Intro to Raytracing (OFFLINE RAYTRACER) Scratchapixel raytracer, but personally, I would go with 1 of the other ones above for raytracing. You should also go over scratch a pixels math lessons though for real graphics programming!
  • Ssloy Tiny Raytracer (OFFLINE RAYTRACER) SSloy Raytracer (again id personally go with 1 of the top 2 in this section, you will do ssloy renderer instead which is much more important!).

IMPORTANT! THIS IS SKIPPABLE BUT READ ALL BEFORE DECIDING > You can skip this section & dive into a graphics API if you want, but the point of this section is to teach you LITERALLY what a graphics specialization (API) is doing for you, which means you will do everything that the graphics specialization does for you in the back, this will help you understand most of the things for the future when you start & pick a graphics API to use.

  • ssloy Ssloy Tiny Renderer, I personally am following this, but if you have another software rasterizer tutorial you are free to choose others ofc, just make sure its good! I just chose this because I see tons of other graphics engineers suggest this!

Welcome to Hell! Pick your choice of pain!
You mainly have 2 choices, either go to the deep end (Vulkan, DX12) if you have prior experience (or if your a beginner with a death wish like me πŸ’ƒ), or if you want to stay safe go with OpenGL. Personally, I have heard mixed opinions at this stage people argue that learning OpenGL is bad nowadays even if they are a "beginner" & should always go to DX 11 at the minimum or just do Vulkan or DX12. & Vice Versa. Important notes about each API:

  • DX (DirectX) is specialized for windows platform only!
  • Vulkan & OpenGL is cross-platform (everything)!
  • Difficulty tiers of the API's from the hardest to easiest - Vulkan >= DX12 > DX11 > OpenGL

Commonly when people see this they just go with a crossplatform API, while thats fine its important to also note that if you plan on targeting windows only DirectX "usually (context is massive)" outperforms cross-platform APIs, However im pretty sure Vulkan does have lower overhead than DX12!

  • Vulkan Game Engine Tutorials Learn Vulkan from Brendan Galea, THIS RESOURCE IS INSANELY INFORMATIVE & HELPFUL THIS SERIES HELPED ME A TON (Optional choice to OpenGL with the benefit that its more updated & its a better graphics specialization, however is difficult for beginners, or just dive in & be a gigachad)
  • Vulkan Tutorial Most popular Vulkan Tutorial page.

  • DX12 Comprehensive guide on learning DirectX 12 by Jeremiah @ 3D Game Engine Programming
  • DX12 Guide by Microsoft

  • LearnD3D11 Learn DirectX11, from the people @ the graphics programming discord server.

  • Learn OpenGl The most popular openGL resource out there.
  • Learning Modern 3D Graphics Programming Style is different & uses openGL but the point is to teach you how to program graphics not use OpenGL! not fixed learning & rather more programming read the about for more info.
  • Scratchapixel Learn almost everything you need in the computer graphics domain, this uses OpenGL.
  • Cherno OpenGL Series Learn OpenGL from Chernos OpenGL Series (Probably really old but whatever)

External notes:

Even though some of these resources are popular doesn't mean they are all "good" & "correct", a popular example of a flawed implementation of a PPFX like bloom for example in a popular resource like learn opengl is actually inaccurate & straight up wrong. Watch Cherno's Bloom Video where he talks about this.
So why am I writing this? To remind you to research yourself how a certain topic is implemented & not taking everything for granted! It's also a good idea to take small breaks & watch some good graphics programmers do stuff for fun while educating you on the side about popular gfx topics to keep you hooked in & keep you interested! I listed some of my favourite graphics people below with their specializations!

  • Cherno Full on Graphics Engineering youtube channel.
  • Acerola Shader Specialized (specifically post processing/screen based shaders) youtube channel.

Here the list will deviate, & you have to do whatever you enjoy and essentially use whatever API you used before & maybe make something for fun, or dive deeper in specific areas for example getting better at shaders (raymarching, FFT water, post processing shaders, GPU instancing etc.).

Shaders

I will list each resource's main shader languague & specialization OR engine its on @ the end of the resource (GLSL/HLSL/CG/Unreal/Unity/OpenGL/DX3D/Vulkan... etc), but it should not matter! It's all translatable! Engine Choice or Graphics Specialization choice should not matter as shaders are literally just math garbage and is translatable everywhere! (yes some things are different but im talking about the big picture)

Shaders can get quite complex, but its all up to your creativity I will list a range of websites that help during all stages of shader development. I have not added specific shaders to do but I will leave that with you to explore with a few to begin with that are fun & kinda "simple" > Fresnel, Toon, Ray Marching & Shell Texturing (My shameless video plug :D).

Not really biased but I just want to say if you can understand everything in catlike coding's rendering section and the many articles from IQ (Inigo Quilez), you will master shaders easily (easier said than done lmfao GL).

  • Text Format

    • Catlike Coding It's a crime that I forgot to put this in. Jasper also covers more advanced topics in the Unity Engine like rendering, reflections, tessellation, etc, literally one of the best resources if not the best! (Unity/CG/HLSL)
    • Lettier's Game Shader 4 Beginners Has many nice guides for Post Processing and other beginning shader topics (OpenGL/GLSL).
    • Book of Shaders Generalized shader learning resource, one of the best out there! (GLSL only)
    • Inigo Quilez Articles One of the handful that can claim to be a Shader Wizard. Your favourite shader probably has some functions yoinked from this guy 😎 (GLSL only)
  • Video Format

    • Kishimisu Youtube Channel Mainly this is for people that are BRAND-NEW to shaders & want to learn in video rather than text, Kishi has great quality videos. (GLSL only)
    • Art of Code Youtube Channel For learning & Writing better shaders using GLSL on Shadertoy (Mainly GLSL & Some CG/HLSL).
  • Splash of random Unity Specific shader resources that I used in the past:

    • Freya Holmer Freya has tons of stuff on their youtube for learning shaders!
    • Ronja Shader Tutorials Many useful shaders with a guide on how they implemented everything!
    • Roystan's Shader Articles Simple guides on beginner shader topics! (Roystan was a life saver when I was a student <3)
    • Ben Cloward Ben does both UNITY & UNREAL, however its all shadergraph, but idea & implementation is all there!

Dive Deep into Computer Graphics (Advanced)

This advanced section is basically the core for end-game graphics, many people consider PBRT the end stage/industry standard & if you achieve physically based rendering and understand it properly you are in a very good place!

Extras

  • Getting A Masters Degree in Computer Science with the final project (the thesis or dissertation whatever the place you choose calls it) based on something related to graphics. This note is for myself, because it sounds fun might do it. Ideas for final project could be a Minecraft Sim / a good raytracer / Voxel Engine & etc.
  • Now throughout all of this notice how I didn't ever mention anything about making a game engine? IMO I think making a game engine is really difficult and takes a SHIT ton of time, if you want to be efficient with your time I think it's something not to do at all early on untill you really are comfortable with graphics! Instead sink your time in making graphics focused projects! A game engine requires support for physics, audio, networking, scripting, models, animation, etc and all the extra garbage that goes in a game engine, I think focusing your time in graphics projects will benefit you more since if you want to become a graphics engineer you will most likely work on the graphics pipeline in a game engine and not the scripting support system, audio or all that extra garbage, let the engine developers do it you will work alongside them anyways (You might also still be forced to join the engine developers (since these roles overlap slightly) & help them do it lmao).
  • I want to highlight that I am not frowning upon creating game engines but I think it's more beneficial for you to make graphics projects! Check out these 2 beautiful graphics projects below!!!
  1. A very nice example of a Voxel engine by John Lin
  2. Example of an extremely good Minecraft Sim by Danol

Life Advice & Closing Notes

Will probably add more stuff here, but I have to mention it's extremely important to find out what you want to do in life, specifically if it's graphics then what with graphics?
Games Industry? Positions that exist are:

  • Technical Artist/Shader Developer (Maybe even VFX position, dealing with particles & shaders).
  • Graphics Engineer / Engine & Graphics Developer.
    (These are the main positions I look for, many other positions also exist just check the image below by hitmarker.)
  • Possibly even a research based position if you get really good & can land a place @ NVIDIA.
    Adding this image for you to see more positions that a graphics dev can also work on alongside pursuing graphics. This image was not made by me, credits go to people @ hitmarker.net.

Movies Industry? I don't really know/care about them, so I won't talk about it here. But I heard there are opportunities over there also for graphics people.

(in brackets will mark a resource I chose to follow & learn with)

Emoji Keys = βœ”οΈ Completed, βŒ› In Progress, ❌ Not Started

  1. Write a software raytracer. βœ”οΈ (Cherno Raytracing Series)
  2. Write a software rasterizer. βœ”οΈ (SSloy Tiny rasterizer, 90% Done)
  3. Write a Hello World Triangle. ❌ (Use a graphics specialization!)
  4. Create a project with the Graphics API of choice (OpenGL, Vulkan, or DX12) & Render 1 Mesh with lighting. ❌

By here we are done technically, & now we just have to be passionate & make something or explore other topics such as:

  • PBR (Physically Based Rendering).
  • PPFX (Post Processing Effects like AO (Ambient Occlusion)).
  • Shaders (Ray-marching fun or Fast Fourier transforms for insane water).
  • This can go on forever but by here we can do whatever as long as we are learning, I personally, will have my next steps below.

Fun Section (How I will be continuing)

  1. Create a graphics-focused Minecraft Sim with any Graphics API.
  2. [Extras] Extend the Minecraft Sim to feature the following/any:
  • Lighting & Water Shader
  • Any Post Processing Effects (Motion blur / Ambient Occlusion / Depth of Field / Bloom / etc.)
  • Multithreading / GPU-Acceleration

Example of an extremely good Minecraft Sim by Danol

About

This is a project with a sole purpose of reminding myself of what I need to learn in order to become a graphics engineer.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published