- 38 hours on-demand video content
- Lifetime access
- Downloadable resources and exercises
- Certificate on completion
- Access on mobile and desktop
- Secure checkout via Credit Card or PayPal
- 14-day money back guarantee
- Last updated April 2024

$79.99

ENROLL NOW FREE PREVIEW14-day money back guarantee

This is one of my favorites!

This course is a complete immersion into the **fundamentals of computer graphics**! You'll learn how a software 3D engine works under the hood, and use the C programming language to write a complete **software rasterizer** from scratch; including textures, camera, clipping, and loading complex OBJ files. *Pixel per pixel, triangle per triangle, mesh per mesh.*

We'll review all the beautiful **math** that makes 3D computer graphics possible as we tackle all concepts from *first principles.* We'll also write a comprehensive software renderer that can display complex 3D objects on the screen **without** the help of any graphics API. **No** GPU, **no** OpenGL, **no** DirectX! Just a C compiler and a little bit of linear algebra is all we need to create a final project that is nothing short of amazing!

We'll simply use the command-line, a code editor, and a C compiler. All these tools are multi-platform, so you'll be able to code along on either **Windows**, **macOS**, or **Linux**!

Also, make sure you have **pen** and **paper** ready for the lectures. This course will probably be a little bit different than other programming courses you took before. We will take our sweet time and make sure we understand *every* formula we find along the way!

This is a self-contained course with **no** prerequisites. However, you will probably get the most out of it if you already know the basics of coding (if-else, loops, functions).

If you never programmed in C before, don't worry! Many successful students come from different languages like Java, Python, JavaScript, Swift, and others. We'll learn to work with the C language together.

**Gustavo Pezzi** is a university lecturer in London, UK. He has won multiple education awards as a teacher and is also the founder of pikuma.com.

Gustavo teaches fundamentals of computer science and mathematics; his academic path includes institutions such as Pittsburg State University, City University of London, and University of Oxford.

38 hours total length • 29 Chapters • Last updated April 2024

- Motivations & Learning Outcomes
- How to Take This Course

- Configuring Dependencies
- Project Folder Structure
- Configuring a Makfile
- Compiling on Linux
- Compiling on macOS
- Configuring Visual Studio on Windows

- Creating an SDL Window
- Declaring a Color Buffer
- Allocating and Freeing Memory
- Quiz: Memory Allocation
- SDL Texture
- Fullscreen Window
- Exercise: Drawing a Background
- Drawing Rectangles
- Quiz: Color Buffer

- Defining Header Files
- Quiz: Header Files

- A Function to Draw Pixels
- Vectors
- Declaring a Vector Type
- Declaring Structs
- Array of Vector Points
- Quiz: Vectors and Points

- Orthographic Projection
- Isometric Projection
- Perspective Projection
- Implementing the Perspective Divide
- Coordinate System Handedness
- Quiz: Perspective Projection

- Transforming Vectors
- Review of Sine, Cosine, and Tangent
- Quiz: Trigonometric Functions
- Rotating Vectors
- Proof of Angle Sine Addition
- Proof of Angle Cosine Addition
- Quiz: Rotating Vectors

- Fixing our Game Loop Timestep
- Using a Delay Function
- Constant Framerate and Variable Delta Time

- 3D Triangles and Meshes
- Vertices and Triangle Faces
- Triangle Edges
- Quiz: Joystick Input

- Line Equation
- DDA Line Drawing Algorithm
- Do We Need Bresenham Lines?
- Coding a Function to Draw Lines

- Dynamic Arrays in C
- Dynamic Mesh Vertices and Faces
- Defining the Project Playfield Graphics

- OBJ File Vertices and Faces
- Exercise: Loading OBJ File Content
- OBJ File Triangles and Quads

- Introduction to Back-face Culling
- Vector Magnitude
- Vector Addition
- Vector Subtraction
- Vector Scaling
- Vector Cross Product
- Finding the Triangle Normal Vector
- Dot Product
- Implementing the Back-face Algorithm
- Vector Normalization
- Quiz: Vector Operations

- Triangle Fill
- Flat-Top & Flat-Bottom Technique
- Flat-Top Triangle Code
- Flat-Bottom Triangle Code
- Avoiding Division by Zero
- Exercise: Different Rendering Methods
- Solid Color Triangle Faces

- Painter's Algorithm
- Exercise: Sorting Faces by Depth
- A Simple Sorting Function

- Matrices Review
- Matrix Operations
- Matrix Multiplication
- Exercise: Matrix Multiplication
- 2D Rotation Matrix

- 3D Scale Matrix
- 3D Translation Matrix
- 3D Rotation Matrices
- The World Matrix
- Order of Matrix Transformations
- Quiz: Matrix Transformations
- Translation is Not a Linear Transformation

- Defining a Projetion Matrix
- Populating the Perspective Projection Matrix
- Exercise: Projecting Negative Z Values
- Projection in OpenGL & DirectX
- Row-Major and Column-Major Order

- Flat Shaded Triangles
- Coding Flat Shading and Light
- Smooth Shading
- Gouraud Shading & Phong Shading

- Representing Textures in Memory
- Textured Triangles
- Textured Flat-Top Triangle
- Textured Flat-Bottom Triangle
- Barycentric Coordinates
- Barycentric Weights (α, β, γ)
- Coding Textured Triangles
- Quiz: Texture Mapping

- Perspective Correct Interpolation
- What Does "Affine" Mean?
- 3D UV Coordinates

- Decoding PNG Files
- Loading PNG File Content
- Freeing PNG Textures from Memory
- Quiz: PNG Files

- Loading OBJ Textures Attributes
- Preventing Texture Buffer Overflow
- Rasterization Rules
- Visualizing Textured OBJ Files

- Implementing a Z-Buffer
- Exercise: Z-Buffer for Flat-Shaded Triangles
- Z-Buffer for Flat-Shaded Triangles
- Reviewing Dynamic Memory Allocation

- Camera Space
- LookAt Camera Model
- LookAt Camera Transformations
- Implementing a Variable Delta Time
- Coding a Simple FPS Camera Movement
- Quiz: Camera Transformations

- Frustum Clipping
- Frustum Planes
- Exercise: Frustum Planes and Normals
- Computing Points Inside and Outside Planes
- Intersection Between Lines and Planes
- Clipping Polygon Against a Plane
- Coding the Function to Clip Polygons Against Planes
- Visualizing Clipped Triangles
- Horizontal and Vertical FOV
- Clipping Texture UV Coordinates
- Clipping Space
- Quiz: 3D Clipping
- Deciding What Not to Render

- Working with Static Variables
- Refactoring SDL Global Variables
- Refactoring Light Code
- Simulating Low-Resolution Display with SDL
- Exercise: Camera Pitch Rotation
- Implementing Camera Pitch Rotation

- Declaring Multiple Meshes
- Coding Multiple Meshes
- Coding Multiple Textures

- Finishing our Code
- Bonus Lecture: Handedness & Orientation
- Bonus Lecture: Dedicated Graphics Cards
- Bonus Lecture: Modern Graphics APIs and Shaders
- Modern 3D Hardware Techniques
- Moving Forward

This course is **not** just a simple tutorial on how to use an existing graphics library or how to glue OpenGL or Vulkan code together. This course focus on the **foundation** of 3D graphics and provides a careful review of the math that underpins these concepts.

If you want to understand how computers display 3D objects on the screen and also learn some of the techniques used in the development of retro 3D games, then buckle up! This is going to be a 35-hour journey of pure nerd fun!

73% of our students **come back** for another course

We **don't** offer discounts on our courses. Ever.

"This course made me love math and graphics!

When I first saw this course description, I figured it would be a fun side project that would help me make a voxel game. Little did I know, this course would actually open my eyes to the wonderful world of computer graphics and the beauty of math.

Gustavo has a knack for presenting information in a super approachable way that leaves you feeling like you truly own the knowledge after you finish watching the video (and either implementing it or working out the math yourself of course).

Thanks to this course, I've really come to appreciate how elegant math can be and how cool it is when it's applied to programming. It's hard to express how awesome it is to go from drawing 2D rectangles to whole 3D models that rotate and move around your screen, knowing that you actually understand everything that's going on in the whole process.

Working through this course has made me seriously consider pursuing a career in graphics. I can't recommend it enough. It's such a fun and educational experience and whether you end up just creating a little side project or sparking a new interest, you won't regret it.

Seriously, just buy it!"

26 May 2024

Rajesh Pillai

"Amazing course! This is absolutely amazing course and covers all the needed fundamentals and math needed for effective 3D programming and more."

18 May 2024

Geoff Banner

"Scratch 3D Graphics! Very good to this point (up to 'transformations') ..have had a fair amount of C/C++ exposure/practice but appreciate the re-iteration of some C code techniques such as structs, etc."

16 May 2024

"A gentle but comprehensive course to rendering!

Let me begin by talking about value and say that to get this quality and depth for this topic, you'd almost certainly end up paying for a course at a college that would charge you much much more than what pay for here.

I've tried Udemy courses and I've tried books, but this is the course that I finally got through and really digested 3D rendering and math.

Speaking of math... there's plenty, it'd be a lie to not say that, but everything is explained step by step, and is broken down into understandable pieces. I would argue that what math is used, and how well it's presented, if you made it out of high school with some trigonometry, you should be able to take on what's in this course.

I do think an introduction to programming in C might be in order for a lot of folks, but that's not too burdensome. After completing this I've gained so much insight into how everything works in 3D, whether it's Blender, video games, or the GPU pipeline.

If you are looking to really comprehend how 3D works under the hood, I feel comfortable saying this is the best bang for your buck."

12 May 2024

Erik Larkin

"Great course! Super interesting content and very well delivered. Thank you Gustavo!"

11 May 2024

30 hours

- Learn to make a simple 2D game engine using modern C++, SDL, ECS, and Lua.

18 hours

- Write a raycasting engine with textures and sprites using the C programming language.

35 hours

- Learn how to create a 2D rigid-body game physics engine from scratch with C++.