Основы компьютерной графики
Эта статья — вход в раздел: без неё легко утонуть в терминах из растровой, векторной или 3D веток. Здесь — общая схема и словарь; детали и примеры кода — в соседних материалах и в итогах.
Сначала пробегите ★-термины ниже
разделы по интересу: фото и форматы → растр; логотипы и SVG → вектор + растеризация; игры и Blender → 3D и Blender.
Основы компьютерной графики
Словарь в одном экране
★ Пиксель — минимальная ячейка растрового изображения; хранит цвет (или индекс в палитре), но не "размер на экране" — масштаб задаётся при выводе.
★ Разрешение — число пикселей по ширине и высоте (например, 1920×1080). PPI/DPI — подсказка устройству, как плотно разложить эти пиксели на дюйм; само разрешение файла от этого не меняется.
★ Растеризация — перевод геометрического описания (линия, треугольник, SVG-путь) в набор пикселей. Так работают и 2D-движки, и GPU в 3D.
★ Шейдер — небольшая программа на GPU: на этапе вершин двигает точки, на этапе фрагментов считает цвет пикселя.
★ Рендеринг — весь процесс получения готового изображения из сцены (геометрия + свет + камера + материалы).
Общая теория
Компьютерная графика — дисциплина, занимающаяся созданием, обработкой, анализом и визуализацией изображений с использованием вычислительных средств. Она лежит в основе множества современных технологий: от пользовательских интерфейсов и полиграфии до кинематографа, архитектурного моделирования и иммерсивных сред виртуальной реальности. Компьютерная графика объединяет методы математики, физики, информатики и визуального искусства, образуя уникальный междисциплинарный инструмент, позволяющий человеку отображать и проектировать реальность.
На практике компьютерная графика разделяется на две основные ветви: растровую (пиксельную) и векторную, хотя в современных системах эти подходы часто интегрируются. Кроме того, различают двумерную (2D) и трёхмерную (3D) графику, каждая из которых требует своих алгоритмов, представлений данных и инструментов.
Ключевые цели компьютерной графики формируют её архитектуру и определяют выбор технологий:
- Визуализация — преобразование абстрактных данных или скрытых структур в наглядную форму. Примеры — графики функций, тепловые карты, CAD-модели, медицинская визуализация.
- Симуляция — воспроизведение поведения реальных объектов и процессов, включая освещение, тени, отражения, физические взаимодействия. Это основа реалистичного рендеринга.
- Интерактивность — обеспечение динамического взаимодействия пользователя с графическим контентом: от перемещения окон до управления аватаром в виртуальном мире.
- Генерация — автоматическое создание изображений, моделей или анимаций с помощью алгоритмических методов, включая процедурную генерацию, генеративные нейросети и параметрическое моделирование.
Рассмотрим эти аспекты систематически.
Основы представления изображений
Любое цифровое изображение — это дискретное представление непрерывного визуального сигнала. В зависимости от способа кодирования выделяют два основных типа:
- Растровая графика представляет изображение как прямоугольную сетку пикселей, каждый из которых обладает определённым цветом. Такой подход эффективен для фотографий и сложных текстур, но подвержен потере качества при масштабировании.
- Векторная графика описывает изображение набором математических примитивов — точек, линий, кривых Безье, полигонов и их атрибутов (толщина, цвет, заливка). Это делает изображение масштабируемым без потерь и особенно полезным для логотипов, схем, чертежей, типографики и печати.
Таким образом, выбор между растровой и векторной графикой определяется задачей: точность репрезентации формы против детализации текстуры.
Цветовые модели и цветовые пространства
Цвет — субъективное восприятие, но для его цифрового представления требуются строгие математические модели. Наиболее распространённые цветовые модели:
RGB (Red, Green, Blue)
Аддитивная модель, основанная на смешении трёх основных цветов света. Используется в устройствах отображения — мониторах, проекторах, телефонах. Каждый канал обычно кодируется 8 битами (0–255), что даёт 16,7 млн возможных цветов в 24-битном режиме.
HSV/HSL (Hue, Saturation, Value/Lightness)
Цилиндрическая модель, ориентированная на интуитивное восприятие цвета человеком. Оттенок (Hue) определяет "цвет" в спектре, насыщенность — чистоту цвета, а значение/светлота — яркость. Широко применяется в графических редакторах для удобства ручной настройки.
CMYK (Cyan, Magenta, Yellow, Key/Black)
Субтрактивная модель, используемая в полиграфии. Здесь цвета формируются путём поглощения (вычитания) света пигментами. Чёрный (Key) добавляется отдельно для улучшения глубины и экономии цветных чернил.
Важно понимать, что модели — это не пространства. Цветовое пространство (например, sRGB, Adobe RGB, DCI-P3) определяет, как конкретные числовые значения интерпретируются в физические цвета. Это влияет на цветопередачу между устройствами.
CIE XYZ, Lab и YCbCr
★ CIE XYZ — эталонная модель, привязанная к восприятию — координаты X, Y, Z описывают цвет независимо от конкретного монитора. Из неё строят профили и перевод между RGB-пространствами.
★ L*a*b* (Lab) — почти равномерное по восприятию пространство: удобно сравнивать "насколько отличаются" два цвета (ΔE) и хранить эталоны в полиграфии.
★ YCbCr — разложение на яркость (Y) и цветоразностные каналы (Cb, Cr). Так кодируют JPEG и видео (MPEG, H.264): глаз чувствительнее к яркости, поэтому цвет сжимают сильнее.
Типичная цепочка для экрана: физический спектр → CIE XYZ → матрица в sRGB → гамма-коррекция в файле → линейные расчёты освещения в рендере → снова sRGB на вывод. Подробнее про форматы файлов — в растровой графике.
Гамма-коррекция и линейные пространства
Человеческое зрение воспринимает яркость нелинейно: мы чувствительнее к тёмным оттенкам. Исторически дисплеи также имели нелинейную световую характеристику. Для компенсации применяется гамма-коррекция — нелинейное преобразование, позволяющее равномерно использовать биты для восприятия. Современные системы графики всё чаще работают в линейном пространстве при расчётах освещения (например, рендеринг в Blender или Unreal Engine), а преобразование в sRGB применяется только на этапе вывода на экран. Это обеспечивает физически корректное смешение света.
HDR и тонмаппинг
High Dynamic Range (HDR) — метод хранения и обработки изображений с динамическим диапазоном, превышающим возможности стандартного дисплея. Вместо 8 бит на канал используются 16- или 32-битные значения с плавающей точкой. Поскольку дисплеи не могут отобразить весь диапазон, применяется тонмаппинг — алгоритм сжатия динамического диапазона с сохранением контрастных деталей. Существуют локальные и глобальные алгоритмы тонмаппинга, каждый со своими компромиссами между реализмом, скоростью и артефактами.
Двумерная и трёхмерная графика
2D-графика и редакторы
Двумерная графика находит применение в UI/UX-дизайне, иллюстрации, анимации, полиграфии и образовательных средах.
- Paint, Paint.NET — растровые редакторы начального и среднего уровня. Paint.NET поддерживает слои, фильтры и плагины, что делает его подходящим для базовой обработки изображений.
- Adobe Photoshop — промышленный стандарт растровой графики — фотообработка, компоновка, текстурирование. Поддерживает сложные рабочие процессы, включая цветокоррекцию и автоматизацию через скрипты.
- Adobe Illustrator, CorelDRAW — векторные редакторы. Используются для создания логотипов, схем, типографики. Основаны на кривых Безье, поддерживают параметрическое редактирование и прецизионную печать.
- Pixel-art и ретро-дизайн — художественный стиль, где каждый пиксель контролируется вручную. Требует специализированных инструментов (Aseprite, GraphicsGale), но развивает понимание цвета, формы и композиции на элементарном уровне.
- Scratch — образовательная платформа, где дети создают интерактивные 2D-анимации и игры, оперируя спрайтами и событиями. Вводит в основы анимации и логики поведения.
- Spine 2D — профессиональный инструмент для скелетной 2D-анимации, особенно в разработке игр. Позволяет анимировать персонажей через деформируемые кости, что экономит ресурсы по сравнению с покадровой анимацией.
3D-моделирование и симуляция
Трёхмерная графика используется для проектирования, симуляции, развлечений и инженерии.
- Blender — открытая, полнофункциональная система для 3D-моделирования, анимации, симуляции, рендеринга и даже видеомонтажа. Поддерживает как растеризацию (EEVEE), так и ray tracing (Cycles).
- Tinkercad — браузерный CAD-инструмент для начинающих, ориентированный на 3D-печать. Оперирует примитивами и булевыми операциями.
- LeoCAD — свободная среда для проектирования моделей LEGO, основанная на LDraw-библиотеке. Полезна для обучения пространственному мышлению и параметрическому конструированию.
- Компас-3D — российская CAD-система, применяемая в машиностроении и промышленном дизайне. Фокусируется на точности, допусках и производственной документации.
Моделирование включает создание геометрии (мешей), материалы, освещение и анимацию. Ключевой элемент — трансформации.
Математические основы 3D-графики
Трёхмерное пространство в компьютерной графике описывается с помощью однородных координат и матричной алгебры. Любая трансформация — перемещение, вращение, масштабирование — представляется как умножение вектора точки на матрицу 4×4.
- Перемещение (Translation): добавление вектора смещения. Реализуется через последний столбец матрицы.
- Вращение (Rotation): описывается углами Эйлера или кватернионами (предпочтительнее для избежания блокировки осей — gimbal lock).
- Масштабирование (Scaling): умножение координат на коэффициенты по осям.
Цепочка трансформаций (например, поворот вокруг собственной оси, затем перемещение в сцену) реализуется путём умножения матриц в обратном порядке (последняя трансформация — левая в произведении).
Проекция
Чтобы отобразить 3D-сцену на 2D-экран, используется проекция:
- Перспективная проекция имитирует свойства человеческого зрения: объекты удаляются — кажутся меньше, параллельные линии сходятся в точке схода. Математически реализуется через деление на Z-координату с использованием однородных координат.
- Ортогональная (ортографическая) проекция сохраняет размеры объектов независимо от расстояния. Применяется в инженерных чертежах и CAD, где важна метрическая точность.
Матрица проекции преобразует координаты из видового (camera) пространства в каноническое (clip space), после чего аппаратура графического процессора выполняет перспективное деление и растеризацию.
Рендеринг
Рендеринг — процесс преобразования трёхмерной сцены, описанной геометрией, материалами, источниками света и камерой, в двумерное изображение. Этот процесс лежит в основе всей визуализации — от простейших UI-элементов до кинематографических сцен, созданных в offline-рендерерах.
Существует два основных подхода к рендерингу:
1. Растеризация (Rasterization)
Это доминирующий метод в реальном времени (real-time rendering), применяемый в играх, интерактивных приложениях и веб-графике. Суть метода:
- Сцена разбивается на примитивы (обычно треугольники).
- Каждый примитив проецируется на экран в 2D-координаты.
- Затем определяется, какие пиксели покрываются этим примитивом (scan conversion).
- Для каждого пикселя вычисляется его цвет на основе материала, освещения и текстур.
Растеризация чрезвычайно оптимизирована на аппаратном уровне: современные GPU содержат сотни растеризаторов, работающих параллельно. Однако метод имеет ограничения — он не моделирует глобальное освещение (отражения, преломления, цветные тени от диффузного рассеяния) без дополнительных приёмов — screen-space reflections (SSR), ambient occlusion, отражающие зонды и т.п. Это компромиссы ради скорости, а не "полная физика света".
2. Трассировка лучей (Ray Tracing)
Метод, основанный на физике распространения света. Для каждого пикселя испускается луч из камеры в сцену; при пересечении с объектом могут испускаться дополнительные лучи — отражённые, преломлённые, теневые. Рекурсивное вычисление позволяет достичь высокой фотореалистичности — точные отражения, мягкие тени, каустики.
- Offline ray tracing — используется в кино и архитектурной визуализации (например, в рендерах Arnold, V-Ray). Время рендеринга одного кадра может составлять часы.
- Real-time ray tracing — стал возможен благодаря специализированным ядрам в GPU (RT Cores в NVIDIA, Ray Accelerators в AMD). Поддерживается в DirectX 12 Ultimate, Vulkan и Metal. Однако даже с ускорением используется гибридно — основное изображение создаётся растеризацией, а ray tracing применяется выборочно (для отражений, теней, глобального освещения).
Более продвинутый подход — path tracing — моделирует путь света от источника к камере, учитывая многократные рассеяния. Это даёт наиболее физически корректный результат, но требует огромных вычислительных ресурсов.
Шейдеры
Современная графика стала возможной благодаря шейдерам — небольшим программам, выполняемым на GPU. Они позволяют контролировать каждый этап визуализации и вводить кастомную логику.
Основные типы шейдеров в конвейере:
- Vertex Shader — выполняется для каждой вершины примитива. Здесь происходит трансформация из локального пространства объекта в clip space, а также передача данных (например, нормалей, UV-координат) в следующие этапы.
- Fragment (Pixel) Shader — вызывается для каждого фрагмента (потенциального пикселя). В нём вычисляется итоговый цвет с учётом текстур, освещения, прозрачности. Именно здесь реализуются эффекты вроде PBR (Physically Based Rendering), параллакс-маппинга, эмиссии.
- Geometry Shader — опциональный этап, позволяющий генерировать или модифицировать примитивы на лету (например, создавать частицы или линии из точек).
- Tessellation Shaders — разбивают крупные полигоны на мелкие на основе уровня детализации, что экономит память при хранении моделей.
- Compute Shader — не привязан к графическому конвейеру; используется для общих вычислений на GPU — физика, постобработка, ИИ.
Шейдеры пишутся на специализированных языках — GLSL (OpenGL), HLSL (DirectX), MSL (Metal), WGSL (WebGPU). Все они похожи по структуре и предоставляют доступ к встроенным функциям линейной алгебры.
Графические API
Приложения не взаимодействуют с GPU напрямую — этим занимается графический API (Application Programming Interface). Он абстрагирует аппаратные различия и предоставляет стандартизированный интерфейс для отправки команд.
Основные API
- OpenGL — кроссплатформенный, открытый стандарт, доминировавший в 2000–2010-х. Прост в освоении, но устарел в части архитектуры: использует "состояния" и скрытые буферы, что мешает эффективному параллелизму. Поддержка прекращена в 2019 году, но остаётся в legacy-системах.
- DirectX 12 — от Microsoft, предназначен для Windows и Xbox. Обеспечивает низкоуровневый контроль над GPU, минимизируя накладные расходы драйвера. Требует от разработчика управления памятью и синхронизацией, но даёт высокую производительность.
- Vulkan — кроссплатформенный преемник OpenGL, разработанный Khronos Group. Аналог DirectX 12 по идеологии — явное управление ресурсами, многопоточная запись команд, предсказуемая производительность. Используется в Android, Linux, Windows, консолях.
- Metal — проприетарный API Apple для iOS, macOS, tvOS. Оптимизирован под собственное железо, обеспечивает минимальную задержку и высокую эффективность энергопотребления.
- WebGL / WebGPU — для веба. WebGL — основана на OpenGL ES, работает в браузере через JavaScript. WebGPU — новое поколение — безопасный, производительный, основанный на идеях Vulkan/DirectX 12. Уже поддерживается в современных браузерах.
Выбор API определяется целевой платформой, требованиями к производительности и командой разработчиков.
Изображение как математическая конструкция
В основе всей компьютерной графики лежит идея: изображение — это математическая функция, определённая на области (экране или странице). В растровой графике эта функция дискретизирована; в векторной — задана аналитически.
- Линии описываются уравнениями (например, y = kx + b) или параметрически (x(t), y(t)).
- Кривые Безье — параметрические кривые по контрольным точкам; кубическая Безье задаётся четырьмя точками. Именно они лежат в основе контуров шрифтов TrueType/OpenType и многих SVG-путей. Подробнее о математике и трансформациях — в векторной графике.
- Полигоны и меш-сетки — основа 3D-моделей. Топология (связность вершин) и геометрия (координаты) разделяются для гибкости.
- Текстуры — функции, отображающие 2D-координаты (UV) в цвет или другие свойства (нормаль, высота, металличность). Это позволяет декорировать поверхность без увеличения геометрической сложности.
Этот подход обеспечивает масштабируемость, редактируемость и точность — ключевые требования в дизайне, типографике, инженерии и печати.
Мини-пример — один треугольник в браузере
Ниже — иллюстрация цепочки вершины → растеризация → цвет пикселя. В реальных приложениях то же делает WebGL/WebGPU или движок вроде Three.js:
// Three.js (идея): три вершины в clip space, простой материал
const geometry = new THREE.BufferGeometry();
const vertices = new Float32Array([
-0.5, -0.5, 0,
0.5, -0.5, 0,
0.0, 0.5, 0,
]);
geometry.setAttribute('position', new THREE.BufferAttribute(vertices, 3));
const material = new THREE.MeshBasicMaterial({ color: 0x3b82f6 });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
Комментарий к коду: BufferGeometry хранит координаты; vertex shader (внутри Three.js) проецирует их на экран; rasterizer GPU закрашивает треугольник; fragment shader возвращает синий цвет. Детали API — в разделе 3D в вебе статьи про 3D-графику.