Учебник Шейдеры и компьютерная графика для начинающих
Глубокий курс о том, как компьютер превращает трёхмерную сцену в плоскую картинку на экране. Вы пройдёте весь путь: пиксели и фреймбуфер, конвейер рендеринга, системы координат и матрицы преобразований, работу GPU и язык шейдеров GLSL, освещение и текстуры, буфер глубины, прозрачность, постобработку, тени, процедурный шум, PBR и трассировку лучей. Математика объясняется интуитивно, с ASCII-схемами и запускаемыми примерами на Python. Для тех, кто хочет понять графику изнутри, а не просто пользоваться готовым движком.
Курс «Шейдеры и компьютерная графика» состоит из 8 разделов и 29 уроков: Как компьютер рисует картинку, Конвейер рендеринга и пространства, Матрицы и векторы в графике, GPU, шейдеры и растеризация, GLSL, освещение и текстуры, Глубина, прозрачность и эффекты, Тени, шум и физичный рендеринг и Трассировка лучей, инструменты и оптимизация. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Как компьютер рисует картинку
- Пиксели и фреймбуфер
Что такое пиксель, как цвет хранится в RGBA-байтах и зачем нужен фреймбуфер — буфер кадра в памяти.
- Частота кадров и время кадра
FPS, миллисекунды на кадр, бюджет 16.7 мс при 60 Гц и почему frame time честнее, чем средний FPS.
- Растровая и векторная графика
Чем растр (пиксельная сетка) отличается от вектора (формулы и кривые), и почему 3D-рендер в итоге всегда растеризуется.
- Пиксели и фреймбуфер
2 Конвейер рендеринга и пространства
- 2D и 3D графика: в чём разница
Почему 3D — это не просто 'плоскость с глубиной': проекция, камера, перспектива и почему всё равно выходит 2D-картинка.
- Обзор graphics pipeline
Все стадии конвейера рендеринга по порядку: вершины, вершинный шейдер, сборка примитивов, растеризация, фрагментный шейдер, тесты, фреймбуфер.
- Системы координат и пространства
Цепочка пространств: локальное (модель) → мировое → вид (камера) → клип → экран, и зачем каждое из них.
- Однородные координаты и компонента w
Зачем к (x,y,z) добавляют четвёртую компоненту w: единое представление точек и направлений, перенос матрицей, деление перспективы.
- 2D и 3D графика: в чём разница
3 Матрицы и векторы в графике
- Матрицы преобразований: перенос, поворот, масштаб
Три базовых преобразования вершин и как они выражаются матрицами; поворот точки на угол через матрицу 2x2.
- Комбинирование преобразований
Почему порядок умножения матриц важен, как масштаб→поворот→перенос складываются в одну матрицу модели.
- Матрица вида и матрица проекции
Как камера задаётся матрицей вида (look-at) и как перспективная против ортографической проекции переводит объём в клип-пространство.
- Векторы, скалярное и векторное произведение
Позиции, направления и нормали как векторы; нормализация, скалярное произведение (угол, освещение) и векторное (нормаль, перпендикуляр).
- Матрицы преобразований: перенос, поворот, масштаб
4 GPU, шейдеры и растеризация
- Что такое GPU и почему он параллельный
CPU против GPU: единицы мощных ядер против тысяч простых; модель SIMT и почему графика идеально параллелится.
- Что такое шейдер
Шейдер как маленькая программа на GPU, исполняемая для каждой вершины или пикселя; типы шейдеров и их место в конвейере.
- Вершинный шейдер
Работа вершинного шейдера: вход — атрибуты вершины, выход — clip-позиция и varying для интерполяции; что он может и не может.
- Растеризация и барицентрические координаты
Как треугольник превращается в фрагменты, что такое барицентрические координаты и как через них интерполируются цвет, UV, глубина.
- Что такое GPU и почему он параллельный
5 GLSL, освещение и текстуры
- Фрагментный шейдер
Фрагментный (пиксельный) шейдер вычисляет цвет каждого фрагмента; вход — интерполированные varying, выход — RGBA.
- Язык GLSL: типы и функции
Векторные и матричные типы (vec2/3/4, mat3/4), swizzling, встроенные функции и квалификаторы uniform/attribute/varying.
- Модель освещения Фонга
Три составляющие света: ambient, diffuse, specular; роль нормалей, направления на свет и на камеру; формула диффузной яркости.
- Текстуры: UV, сэмплирование, фильтрация
Как картинка натягивается на меш через UV-координаты, что такое сэмплирование, билинейная фильтрация и mipmap.
- Фрагментный шейдер
6 Глубина, прозрачность и эффекты
- Карты нормалей и продвинутые текстуры
Как normal map подделывает рельеф без лишних полигонов, и какие ещё карты (roughness, metallic, AO) управляют видом поверхности.
- Буфер глубины и z-buffer
Как z-buffer решает, какой объект ближе и виден; тест глубины, отсечение задних граней и z-fighting.
- Прозрачность и блендинг
Альфа-канал, формула смешивания src/dst, почему прозрачное сортируют back-to-front и где z-buffer мешает.
- Постобработка: эффекты на весь экран
Рендер в текстуру и full-screen quad: блюр, свечение (bloom), тонмаппинг — как обрабатывают готовый кадр целиком.
- Карты нормалей и продвинутые текстуры
7 Тени, шум и физичный рендеринг
- Тени: shadow mapping
Идея теневой карты: отрендерить глубину из позиции света и сравнить её при рисовании сцены; что такое shadow acne и PCF.
- Процедурная графика и шум
Как из псевдослучайности и шума Перлина рождаются природные узоры: вода, огонь, облака, ландшафт; гладкость против белого шума.
- Физически корректный рендеринг (PBR)
Зачем нужен PBR, понятия albedo/metallic/roughness, закон сохранения энергии и почему материалы выглядят одинаково при любом свете.
- Тени: shadow mapping
8 Трассировка лучей, инструменты и оптимизация
- Рейтрейсинг против растеризации
Как трассировка лучей считает свет, идя из камеры в сцену; почему она физичнее, но дороже растеризации, и где они сочетаются.
- Инструменты: где практиковать шейдеры
Shadertoy для фрагментных шейдеров в браузере, шейдеры в Three.js/WebGL, ShaderToy-функции mainImage и iTime; с чего начать.
- Оптимизация графики: draw calls, batching, LOD
Где теряется производительность: число draw calls, объединение в батчи, уровни детализации (LOD), отсечение невидимого (culling).
- Рейтрейсинг против растеризации