This repository contains different resources which may be helpful during your journey of becoming a graphics developer. The list is supported by @prographon community. Our current plans include finding more high-quality books, tutorials and articles, creating a step-by-step guide (roadmap) for becoming a graphics engineer and sharing knowledge about new edge-breaking technologies in Computer Graphics.
The first thing to note is that to become graphic/rendering developer you must really know a lot. Almost all engines are written in C++, so you must certainly learn it first before diving into rendering. Knowledge of computer architecture is also highly recommended, specifically GPU architecture. C++/other languages resources are not present in this roadmap, as they are not explicitly related to graphics. You can either learn these topics first and then return to graphics, or try learning everything in parallel - the choice is up to you. Also, it is required to understand at least basics of linear algebra and trigonometry.
One of the easiest way to touch graphics programming without dealing with real graphic APIs is to write a software rasterizer/raytracer. Ssloy's tutorials contain two very well written tutorials: tinyraytracer and tinyrenderer. You can go through them first and get a good insight on how raytracing and graphic API implementation works, without even touching a real GPU.
The best way to get insight of how GPU work is to try to adapt your code for parallel processing. If you followed the first step, at this point you have a nice looking path tracer / renderer, which now you can speed up by porting your rendering code to OpenCL or Cuda. These are the frameworks for general purpose GPU computing which are not yet graphic APIs, but introduce some new concepts with which you should become familiar. If you already tried to optimize your projects by utilizing multiple CPU cores, the process of porting should not be hard.
Now when you have a bit of understanding of how interact with GPU, you can finally dive into real graphic APIs. The opinions may vary, but the smoothest learning curve is achieved when you start from the simplest graphic APIs, such as OpenGL, and only after mastering it switching to more verbose, like DirectX 12 or Vulkan. Note that even with OpenGL you can write almost everything, including 2D renderer, first-person shooter game or general-purpose game engine. It is okay spending a year on a project which seemed simple at first glance, as long as it helps you to learn and give you a joy. For best start we suggest watching Cherno's OpenGL series and going through LearnOpenGL turorials. Your main goal at this stage is to understand how GPU rendering works, implement classic algorithms like shadow mapping and deferred rendering, and create your own physically based renderer. We believe that these are the topics which any graphic engineer should understand to be ready for real job in rendering team.
At this point you should be quite familiar with graphic API and can implement some basic algorithms in graphics. From here you can move forward to more advanced APIs, like Vulkan, DirectX12 or Metal, which are positioned as industry standard in most companies which focus on gamedev/CGI. It does not actually matter a lot which API from these three you choose, as they are all quite simular and it does not take much time to switch from one to another. In this guide we suggest to stick with Vulkan, because it is cross-platform, have lots of great tutorials and materials and introduce most of the graphic API concepts which you potentially may encounter while working with any other graphic API.
As you already have an OpenGL renderer, a good idea will be to port it to Vulkan API (or maybe support both APis). To begin with, we suggest to follow Intel's Vulkan guide, with assist of some additional resources, like Vulkan Engine Guide
and Writing an efficient Vulkan renderer
by Zeux. During development you will definitely encounter some problems which may seem hard to deal with, such as barrier placement, descriptor allocation, render pass manegement. As they are quite common, people have already come up with some good solid solutions, like render-graph based rendering and hybrid rendering.
So, all in all, the main goal for your at this stage is to create a high-performance, low overhead rendering framework with convinient to use interface. It will be both a good pet project for your graphics developer resume and an excellent sandbox with lots of opportunities for further experimentations.
- Learn OpenGL - modern (3.3+) OpenGL tutorial (phong lighting, shadow mapping, mesh loading, deferred rendering, PBR + IBL lighting)
- OpenGL step by step - modern (3.3+) OpenGL tutorial (phong lighting, shadow mapping, mesh loading, deferred rendering, skeletal animation)
- OpenGL tutorial - modern (3.3+) OpenGL tutorial (phong lighting, shadow mapping, text rendering, mesh loading)
- OpenGL by The Cherno - step by step OpenGL course for beginners (basic 2D rendering, texturing, batching)
- Vulkan 1.2 API Specifications - Official Vulkan specification by Khronos Group
- Vulkan Tutorial - Vulkan tutorial teaching basics of the API (initializing context, drawing triangle, texturing, mesh loading)
- API without Secrets: Introduction to Vulkan - in depth tutorial about Vulkan API (initializing context, swapchain, drawing triangle, descriptor sets)
- Vulkan Guide - Vulkan guide by Khronos Group (graphic pipeline, layers, memory allocations, synchronization)
- niagara: Building a Vulkan renderer from scratch - In-depth lessons series about how to use few modern Vulkan rendering techniques, such as GPU culling & scene submission, cone culling, automatic occlusion culling, task/mesh shading, and others
- Tips and Tricks: Vulkan Dos and Don’ts - Nvidia's tips for designing high performance Vulkan applications
- Vulkanised - Open webinars about Vulkan best practices and pitfalls by Khronos Group
- Writing an efficient Vulkan renderer - Chapter about Vulkan renderer from GPU Zen 2 book in a form of the blogpost
- Vulkan Engine Guide - Vulkan game engine guide focuses around dynamic rendering. This tutorial use extra libraries like Vk Bootstrap and VMA to simplify boilerplate Vulkan code and memory allocation.
- Vulkan Game Engine by Brendan Galea - Useful step by step tutorial on writing a game engine with a detailed illustrated description of how Vulkan works (not finished yet).
- Yet another blog explaining Vulkan synchronization - guide to Vulkan synchronization (barriers, semaphores, fences and etc.). Referenced by official Khronos blog.
- Render graphs and Vulkan - a deep dive - series of articles about implementation of render-graph based rendering in Vulkan
- Learning DirectX 12 - in depth tutorial about DirectX 12 API (graphic pipeline, command queues, descriptor sets, texturing)
- Official DirectX 12 Graphics samples by Microsoft
- Official DirectX documentation
- Official DXIL documentation
- DirectX supplementary specs (GitHub)
- DirectX 3D Series
- Braynzar soft DirectX 12 tutorials
- Explainer and FAQ - why proposed
- WebGPU Shading Language - working draft
- webgpu.h - header as a platform-agnostic HAL between implementations
- dawn - C++ implementation from Google
- wgpu - Rust implementation from Mozilla
- demo.design 3D programming FAQ
- Fast affine texture mapping
- Ultimate /|\ ATARI 4nd d3m0 coding page !!!
- Poor man's bilinear
- Coding 3D Engines by Luki
- 256-Color VGA Programming in C
- PlayStation Ordering Table Tutorial
- The Coverage Buffer (C-Buffer)
- Realtime Rendering (graphics hardware, shading & lighting algorithms, ray tracing)
- Physically Based Rendering: From Theory To Implementation (PBR, photorealistic rendering, sampling methods)
- Substance PBR Guide
- Advanced Global Illumination (global illumination algorithms, light transport theory, radiosity)
- GPU Gems (collections of different 3D graphics algorithms)
- Ray Tracing in One Weekend Book Series (software ray tracing, BVH)
- Collection of PDF books about graphics and programming
- GPU Pro (like GPU Gems, but it's closer to state-of-art)
- Mathematics for 3D Game Programming and Computer Graphics (very useful book, covers almost everything needed for a start, pretty much a classic book)
- EPFL Realistic Graphics Lab
- KIT Computer Graphics Group
- Utah Graphics Lab
- Cornell University
- NVIDIA
- AMD
- Valve
- Unity
- Common Interview Questions for a Graphics Programmer - checklist for a Junior Graphics Programmer
- Basic Theory of Physically-Based Rendering by Marmoset
- Physically Based Rendering in Filament - equations and theory behind the material and lighting models used in Filament.
- Ssloy's tutorials - tinyrenderer (software rasterizer), tinyraytacer (software ray-tracer)
- Common techniques to improve shadow maps - antialiasing algorithm for shadows, cascaded shadow maps, solutions to common problems (with DirectX 11 code snippets)
- AMD RDNA2 Perfomance Guide
- Advances in Real-Time Rendering in 3D Graphics and Games
- GDC Vault
- Interactive 3D Graphics (Eric Haines)
- TU Wien Ray tracing course - A course on photorealistic rendering, ray tracing and global illumination at the TU Wien
- Cem Yuksel Intro to Graphics - A course explaining mostly theoretical part of computer graphics, global illumination and simulation
- Cem Yuksel Interactive Graphics - A course mostly for practical real-time renderer implementation
- Two Minute Papers - summaries of modern articles on computer graphics
- Graphics Programming weekly - weekly newsletter with CG materials
- Self Shadow - Stephen Hill, principal rendering engineer, Lucasfilm Advanced Development Group
- Wicked Engine Net - blog about computer graphics and game engine dev by graphics programmer at Sony
- Ray Tracey's blog - Sam Lapere, scientific visualization devtech at Nvidia
- Eric Heitz - research scientist at Unity Technologies
- Wenzel Jakob - assistant professor leading the Realistic Graphics Lab at EPFL's School of Computer and Communication Sciences
- Real-time rendering resources - resources page for the book Real-Time Rendering and a lot of useful links
- Alian Galvan - graphics programmer at Marmoset about engine development, samples with different graphics API
- Game Development by Sean - game and engine development, common techniques
- CODE517E - blog about graphics by graphics programmer at Altera
- Aras P - lead graphics programmer at Unity, contains many tricks and techniques
- Arseny Kapoulkine - technical fellow at Roblox, Vulkan-related and mobile stuff
- Adrian Courreges - collection of frame analysis during current decade of different games
- Matt Pettineo - lead graphics/engine programmer at Ready At Dawn Studios, articles about Spherical Gaussians and GPU Barriers
- Emilio Lopez - Senior Graphics Engineer at Playground Games. Previously making LEGO at Traveller's Tales.
- Simon Coenen - Platform Engineer at Studio Gobo, Brighton.
- Inigo Quilez - articles about sdf, raymarching etc.
- Jasper St. Pierre - Creator of noclip.website and YouTube channel. Staff Graphics Engineer at Cryptic Studios.
- Maister's Graphics Adventures - low level graphics programming from author of Granite
- A trip through the Graphics Pipeline 2011 - Old but still up-to-date articles on GPU and driver internals.
- Shader Playground - powerful online shader compiler
- Shadertoy - shader showcase sandbox
- GPU info - open database of Vulkan, GL and GLES devices, their capabilities and supported extensions
- HexEd - browser-based hex editor
- RenderDoc - very powerful Vulkan, DirectX and OpenGL debugger with support of in-engine integration
- AMD CodeXL - CPU/GPU debugger and profiler
- AMD Compressonator - tool for texture compression
- AMD GPU Profiler
- AMD Memory Visualizer
- AMD Developer Panel
- AMD GPU Analyzer - offline compiling tool and ISA inspector
- NVidia NSight - powerful profiling tool, support of ray-tracing debugging
- Intel GPA
- Apple Metal debugger - powerful macOS and iOS graphics debugger, profiler with shader debugging
- ShaderED - shader IDE with lots of debugging utilities
- Microsoft PIX - powerful Windows and XBOX debugger and profiler
- PowerVR SDK Tools - collection of tools for graphics programming
- Naga - convert from one shader format into another