Виды компьютерной графики: растровая, векторная, трехмерная и фрактальная

Виды компьютерной графики: растровая, векторная, трехмерная и фрактальная Полезное

Компьютерная графика — это создание, хранение и обработка изображений с помощью компьютера. Ее виды различают по тому, как описано изображение: растровая графика хранит сетку пикселей, векторная — геометрические фигуры, трехмерная (3D) — модель объектов в пространстве, фрактальная — формулу, по которой картинка вычисляется.

Ниже — сравнительная таблица, короткий разбор каждого вида с примером на Python и схема «задача -> какой вид графики взять».

Способ описания и то, что видно на экране

Сначала разведем два уровня, которые часто путают. Способ описания — то, что лежит в файле: пиксели, фигуры, вершины или формула. Отображение — то, что показывает монитор, а он всегда выводит пиксели. Векторный логотип и 3D-сцена перед показом тоже превращаются в растр: этот шаг называется растеризацией (для 3D — рендерингом).

Поэтому вид графики — это не «как картинка выглядит», а в каком виде ее хранят и редактируют. От этого зависят масштабирование, вес файла и набор инструментов.

Сравнение видов графики

Вид Что хранится Масштабирование Типичные задачи Форматы Инструменты
Растровая Сетка пикселей с цветом каждого Увеличение сверх исходного размера теряет четкость Фото, цифровая живопись, текстуры, скриншоты JPEG, PNG, WebP, AVIF, GIF, TIFF, RAW Photoshop, GIMP, Krita
Векторная Фигуры и кривые с координатами и заливкой Без потерь в любом размере Логотипы, иконки, схемы, шрифты, макеты печати SVG, AI, EPS, PDF Illustrator, Inkscape, Figma
Трехмерная Вершины и полигоны, материалы, свет, камера Модель смотрят с любой точки, итог — рендер в пиксели Игры, кино, визуализация, AR/VR FBX, OBJ, glTF/GLB, USD Blender, Maya, 3ds Max, движки Unity и Unreal Engine
Фрактальная Формула и правило повторения Детали вычисляются заново на любом увеличении Процедурные ландшафты и текстуры, генеративное искусство Как правило, результат сохраняют растром Код, генераторы, узлы шума в 3D-пакетах

Фрактальную графику в школьной информатике выделяют отдельным видом, а в индустрии это скорее прием процедурной генерации внутри растровых и 3D-проектов. Граница между видами тоже не жесткая: PDF и SVG могут содержать растровые вставки, а 3D-модель обтягивают растровыми текстурами.

Растровая и векторная графика на одном примере

Возьмем одну фигуру — круг — и опишем ее обоими способами. Скрипт работает на стандартной библиотеке, проверен на Python 3.14:

# Один и тот же круг: растром (сетка пикселей) и вектором (описание фигуры)

def raster_circle(size):
    """Растр: для каждого пикселя решаем, закрашен он (1) или нет (0)."""
    c = (size - 1) / 2
    r = size / 2
    return [[1 if (x - c) ** 2 + (y - c) ** 2 <= r * r else 0
             for x in range(size)] for y in range(size)]

def upscale(grid, k):
    """Увеличение готового растра: каждый пиксель становится квадратом k x k."""
    return [[p for p in row for _ in range(k)] for row in grid for _ in range(k)]

def svg_circle(r):
    """Вектор: храним не пиксели, а параметры фигуры."""
    return (f'<svg viewBox="0 0 {2 * r} {2 * r}">'
            f'<circle cx="{r}" cy="{r}" r="{r}"/></svg>')

enlarged = upscale(raster_circle(5), 3)   # растр 5x5, растянутый до 15x15
redrawn = raster_circle(15)                # фигура, заново отрисованная в 15x15
for a, b in zip(enlarged, redrawn):
    print("".join("#" if p else "." for p in a), "  ",
          "".join("#" if p else "." for p in b))

print(len(svg_circle(5)), "байт SVG при r=5")
print(len(svg_circle(5000)), "байт SVG при r=5000")

Результат: слева растр 5×5, растянутый в три раза, справа тот же круг, заново нарисованный в сетке 15×15.

...#########...    .....#####.....
...#########...    ...#########...
...#########...    ..###########..
###############    .#############.
###############    .#############.
###############    ###############
###############    ###############
###############    ###############
###############    ###############
###############    ###############
###############    .#############.
###############    .#############.
...#########...    ..###########..
...#########...    ...#########...
...#########...    .....#####.....
60 байт SVG при r=5
75 байт SVG при r=5000

Растянутый растр превратился в «крест» из крупных квадратов: новых деталей взять неоткуда, программа только повторяет существующие пиксели (графические редакторы вместо простого повтора интерполируют, но это дает размытие, а не новые детали). Векторное описание весит одинаково при радиусе 5 и 5000, а четкость зависит лишь от того, в каком разрешении его растеризуют. Строка SVG здесь рассчитана на вставку в HTML-страницу; отдельному .svg-файлу нужен еще атрибут xmlns.

Растровая графика: разрешение и глубина цвета

Пиксель — минимальный элемент растра, у которого есть положение в сетке и цвет. У растра две главные характеристики:

  • разрешение — число пикселей по ширине и высоте (например, 1920×1080);
  • глубина цвета — сколько бит отводится на цвет пикселя; число цветов равно 2 в степени числа бит.

Разрешение в пикселях и плотность печати (ppi/dpi) — разные параметры: первое задает объем информации, второе — во сколько пикселей на дюйм ее «упакуют» на бумаге. Посчитаем оба:

# Сколько весит растр без сжатия и какого размера выйдет отпечаток

def raw_bytes(width, height, bits_per_pixel):
    return width * height * bits_per_pixel // 8

# (бит на пиксель, из них бит на цвет); в 32 битах 8 бит - альфа-канал
for bpp, color_bits in ((1, 1), (8, 8), (24, 24), (32, 24)):
    size = raw_bytes(1920, 1080, bpp)
    print(f"{bpp:>2} бит/пиксель: {2 ** color_bits:>10,} цветов, "
          f"{size:>9,} байт ({size / 2 ** 20:.2f} МиБ)")

# Разрешение в пикселях и плотность печати (ppi) - разные параметры
w_px, h_px = 3000, 2000
for ppi in (300, 150):
    print(f"{w_px}x{h_px} при {ppi} ppi: "
          f"{w_px / ppi * 2.54:.1f} x {h_px / ppi * 2.54:.1f} см")
 1 бит/пиксель:          2 цветов,   259,200 байт (0.25 МиБ)
 8 бит/пиксель:        256 цветов, 2,073,600 байт (1.98 МиБ)
24 бит/пиксель: 16,777,216 цветов, 6,220,800 байт (5.93 МиБ)
32 бит/пиксель: 16,777,216 цветов, 8,294,400 байт (7.91 МиБ)
3000x2000 при 300 ppi: 25.4 x 16.9 см
3000x2000 при 150 ppi: 50.8 x 33.9 см

Кадр Full HD без сжатия занимает почти 6 МиБ, поэтому растр почти всегда хранят сжатым. В 32-битном варианте цветов столько же, сколько в 24-битном: лишние 8 бит уходят на прозрачность (альфа-канал). А один и тот же снимок 3000×2000 дает отпечаток 25 см при 300 ppi или 51 см при 150 ppi — пикселей не прибавилось, изменилась плотность.

Сжатие бывает без потерь (PNG, GIF) и с потерями (JPEG): второе отбрасывает мелкие детали, и на резких границах появляются артефакты. WebP и AVIF поддерживают оба режима. GIF ограничен палитрой до 256 цветов на кадр и сегодня нужен в основном для простой анимации. RAW — не единый формат, а общее название «сырых» данных с матрицы камеры, у каждого производителя свой вариант.

Векторная графика: когда нужна

Векторный рисунок состоит из объектов — линий, кривых Безье, многоугольников, текста — с координатами, толщиной обводки и заливкой. Его выбирают, когда одно изображение нужно в разных размерах: логотип на визитке и на баннере, иконки интерфейса под экраны разной плотности, чертежи и схемы.

Фотографию описывать векторными примитивами непрактично: автотрассировка дает тысячи контуров, файл выходит тяжелее исходного JPEG, а тонкие переходы тона теряются. Формат Flash (SWF), который упоминают старые учебники, больше не поддерживается браузерами — для веба сейчас используют SVG.

Трехмерная графика: модель и рендер

3D-модель — это набор вершин в пространстве, соединенных в полигоны, плюс материалы, текстуры и источники света. Чтобы получить картинку, программа проецирует вершины на плоскость экрана и закрашивает пиксели. Мини-модель проекции и фрактал в одном скрипте (Python 3.14):

# 3D: модель - это координаты вершин; картинку получают проекцией на экран
cube = [(x, y, z) for x in (-1, 1) for y in (-1, 1) for z in (-1, 1)]

def project(point, focal=2.0, distance=4.0):
    """Перспективная проекция: чем дальше точка (больше z), тем ближе к центру."""
    x, y, z = point
    k = focal / (z + distance)
    return round(x * k, 2), round(y * k, 2)

for v in cube[:4]:
    print(v, "->", project(v))

# Фрактал: треугольник Серпинского из одного правила (x & y == 0)
for y in range(16):
    print("".join("#" if (x & y) == 0 else " " for x in range(16)).rstrip())
(-1, -1, -1) -> (-0.67, -0.67)
(-1, -1, 1) -> (-0.4, -0.4)
(-1, 1, -1) -> (-0.67, 0.67)
(-1, 1, 1) -> (-0.4, 0.4)
################
# # # # # # # #
##  ##  ##  ##
#   #   #   #
####    ####
# #     # #
##      ##
#       #
########
# # # #
##  ##
#   #
####
# #
##
#

Дальние вершины куба (z = 1) легли ближе к центру, чем ближние (z = -1): так работает перспектива. Это упрощенная модель — настоящий конвейер рендеринга еще учитывает поворот камеры, отсечение невидимого, освещение и текстуры.

Трехмерную графику делят на рендеринг в реальном времени (игры и интерактив, кадр за миллисекунды на видеокарте, например в Unity 6 или Unreal Engine 5) и офлайн-рендеринг (кино и реклама, кадр может считаться минуты и часы ради физически точного света).

Фрактальная графика: изображение из формулы

Фрактал — фигура, части которой повторяют целое в уменьшенном виде. Треугольник Серпинского выше построен одним правилом x & y == 0 для каждой клетки сетки: в файле достаточно хранить правило, картинку можно вычислить в любом размере. На практике фрактальные алгоритмы (например, сложение нескольких октав шума) генерируют рельеф, облака, текстуры камня и коры в играх и 3D-пакетах.

Какой вид графики выбрать под задачу

Задача Что взять Когда иначе
Обработать фото, нарисовать иллюстрацию с текстурой Растр Если иллюстрация плоская и нужна в разных размерах — вектор
Логотип, иконки, схема, инфографика Вектор (SVG, AI) Для соцсетей и мессенджеров экспортировать копию в PNG
2D-игра Растровые спрайты Для интерфейса и масштабируемых элементов — вектор
3D-игра, визуализация объекта, AR 3D-модель + растровые текстуры —
Большой ландшафт или бесконечная текстура Процедурная (фрактальная) генерация Уникальные ключевые места доводят вручную

Выводы

  • Виды компьютерной графики различают по способу описания изображения: пиксели (растр), фигуры (вектор), модель в пространстве (3D), формула (фрактал).
  • На экране все виды в итоге становятся пикселями; различаются хранение, редактирование и масштабирование.
  • Растр передает фото и сложные тона, но теряет четкость при увеличении; вес зависит от разрешения, глубины цвета и сжатия.
  • Вектор масштабируется без потерь и удобен для логотипов и схем, но непрактичен для фотографий.
  • 3D-модель превращается в картинку рендерингом, а фрактальные алгоритмы в основном работают внутри растровых и 3D-проектов.

Где применяется / связь с практикой

Все четыре вида графики встречаются в одном месте — в разработке игр. Спрайты и текстуры — растр, иконки интерфейса часто рисуют в векторе, персонажи и уровни — 3D-модели, а рельеф и шум генерируются процедурно. Подробнее о 2D-части — в статье об основах спрайтовой графики в играх.

Освойте тему на практике

Если хочется собрать из этого работающую сцену, основы движка и C#-скриптов разбирают на курсе «Unity Game Developer. Basic». Посмотреть, как проходят занятия, можно на открытых уроках Otus.

FAQ

Можно ли превратить растровое изображение в векторное?
Да, это делает автотрассировка (например, в Inkscape или Illustrator). Для простых логотипов результат бывает приемлемым, для фотографий — нет: получается много контуров и потеря деталей.

Чем dpi отличается от ppi?
Ppi — плотность пикселей изображения или экрана, dpi — плотность точек краски у принтера. В бытовой речи их часто смешивают, но при подготовке к печати важен именно ppi файла.

Является ли пиксель-арт векторной графикой?
Нет, пиксель-арт — растр с намеренно низким разрешением. Его масштабируют в целое число раз без сглаживания, чтобы пиксели оставались четкими квадратами.

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)