Лекция 1 | Компьютерная графика | Виталий Галинский | Лекториум

YOUTUBE · 19.11.2025 06:11

Ключевые темы и таймкоды

Введение в обработку изображений и визуализацию

0:14
  • Обработка изображений — ключевой элемент для создания визуализаций.
  • Визуализация связана с построением пространственных изображений на плоском экране.
  • Курс посвящён созданию рендеров для вывода проекций трёхмерных сцен.

Динамическая и статическая графика

1:12
  • Динамическая графика обеспечивает отображение информации в реальном времени.
  • Статическая графика используется в кино, где каждый кадр рассчитывается отдельно.
  • Темы курса: растровая графика, растеризация, оптимизация алгоритмов.

Кодирование цвета

2:20
  • Цвет в компьютере представляется дискретно, в отличие от аналогового восприятия человеком.
  • Обсуждаются методы кодирования цвета и цветовые модели.

Математика и линейная алгебра

3:01
  • Основы линейной алгебры необходимы для понимания преобразований в пространстве.
  • Матрицы позволяют компактно записывать операции с объектами.

Динамическая визуализация

4:45
  • Курс ориентирован на динамическую визуализацию и работу с Open GL.
  • Рассматриваются нюансы представления данных внутри видеокарты.

Алгоритм рейтрейсинга

6:36
  • Рейтрейсинг — старый алгоритм, использующий метод «грубых сил».
  • Современные видеокарты аппаратно реализуют пересечение лучей с объектами.
  • Алгоритм позволяет моделировать геометрическую оптику и сложные физические модели.

Практические задания и моделирование эффектов

9:06
  • Практическое задание: создание рендера с моделью освещения.
  • Моделирование случайных эффектов, таких как дымка и другие случайные явления.
  • Создание детерминированных функций для псевдослучайных эффектов.

Распределённая трассировка лучей

11:07
  • Распределённая трассировка лучей используется для моделирования объёмных точек света и эффектов размытия.
  • Завершающий блок курса посвящён работе с библиотеками.

Введение в библиотеки для работы с графикой

11:24
  • Обсуждение четырёх основных библиотек для работы с трёхмерной графикой: DirectX, OpenGL, Vulkan и Metal.
  • DirectX 3D использует объектную модель, основанную на компонентах и модулях.
  • OpenGL предлагает подход расширения, позволяющий программе получать функционал на лету.

Особенности OpenGL

12:56
  • OpenGL удобен для динамического рендеринга в реальном времени.
  • Примеры будут приведены на языке C++, так как он прост и доступен на любой платформе.
  • Идеология OpenGL основана на модели «клиент-сервер», где библиотека выступает в роли сервера.

Развитие видеокарт и библиотек

14:49
  • Современные видеокарты требуют значительных объёмов памяти для хранения данных.
  • Примитивы и текстуры занимают много места и играют ключевую роль в обработке графики.
  • Текстуры используются для детализации поверхности объектов.

Шейдеры и их функции

17:10
  • Шейдеры — это активные части программы, выполняемые на видеокарте.
  • Пиксельные шейдеры позволяют обрабатывать каждый пиксель индивидуально, например, изменять его цвет или освещение.
  • Геометрические шейдеры позволяют порождать новые геометрические фигуры на видеокарте.

Тесселяция и детализация поверхностей

19:40
  • Тесселяция — это разбиение поверхности на дополнительные геометрические данные для повышения детализации.
  • Видеокарта выполняет детализацию поверхности на лету, используя опорные точки.
  • Контрольный шейдер задаёт параметры разбиения, а вычислительный шейдер вычисляет координаты дополнительных точек.

Параллельная обработка и оптимизация

22:05
  • Видеокарты выполняют код параллельно, используя множество вычислительных ядер.
  • Одна пиксельная программа может выполняться для всех пикселей одновременно, что значительно ускоряет процесс рендеринга.
  • Оптимизация позволяет эффективно использовать ресурсы видеокарты.

История мониторов

23:09
  • Первые мониторы были векторными, основанными на электронно-лучевых трубках.
  • Векторные мониторы рисовали фигуры отрезками, что снижало эффективность при увеличении сложности модели.
  • Необходимость перерисовки сцены при увеличении количества геометрических данных делала мониторы неэффективными.

Проблемы векторных мониторов

24:07
  • Низкая скорость обновления экрана из-за использования электронно-лучевой трубки.
  • Растровые дисплеи были непопулярны из-за высокой стоимости видеопамяти.
  • Графические рабочие станции конца 80-х годов имели дорогие видеокарты с высоким разрешением.

Современные мониторы и пиксели

25:06
  • Современные экраны разбиты на пиксели.
  • Видеокарта подаёт сигнал на монитор, сканируя видеопамять.
  • Проблема синхронизации кадров на старых мониторах приводила к появлению полос.

Вертикальная синхронизация

27:05
  • Вертикальная синхронизация предотвращает расслоение изображения на разные части от разных кадров.
  • Видеокарта записывает данные в видеопамять в момент движения луча по кадру.

Архитектура видеопамяти

27:54
  • Видеопамять хранит информацию о цветах, используя аддитивную модель.
  • Каждый компонент цвета кодируется четырьмя байтами, третий байт обычно не используется.
  • Остальная часть видеопамяти может использоваться для хранения данных о геометрии или текстурах.

Техника флип-кадров

29:54
  • Флип-кадры позволяют хранить два кадра в памяти и отображать их по очереди.
  • Эта техника использовалась в старых играх для предотвращения эффекта моргания.
  • Современные видеокарты могут копировать данные между буферами для улучшения производительности.

Кодирование цвета

30:34
  • Кодирование цвета происходит в недрах видеокарты.
  • Качество разных форматов растровых изображений может сильно отличаться из-за различий в кодировании цвета.
  • Обсуждение кодирования цвета будет продолжено в дальнейшем.

Представление цвета в компьютерах

31:54
  • Цвет в компьютерах кодируется двумя способами: индексированное хранение и хранение в чистом виде.
  • Индексированное хранение характерно для старых видеокарт, таких как VGA.
  • В старых видеокартах цвета представлялись через таблицу, где каждому номеру соответствовала триада RGB.

Принцип работы индексированного хранения

32:49
  • Цифро-аналоговый преобразователь преобразует содержимое видеокарты в видеосигнал.
  • По номеру цвета из таблицы находится соответствующий цвет и выводится на экран.
  • Палитра по умолчанию включает первые шестнадцать цветов, которые представляют собой комбинации RGB и бит яркости.

Режим TruColor

33:49
  • TruColor позволяет задавать цвет отдельными компонентами RGB.
  • Каждая компонента хранится отдельно для ускорения обработки данных.
  • Старые устройства использовали два байта на точку, упаковывая три компонента в два байта.

Квантование цвета

34:46
  • Квантование цвета может быть разным: 5-5-5 с 32 уровнями или 5-6-5 с 64 уровнями.
  • Различия в квантовании могут приводить к зеленоватым полосам на оттенках серого.
  • Современные видеокарты обычно поддерживают TruColor, что устраняет проблемы с цветовыми пространствами.

Проблемы кодирования изображений

35:44
  • Некоторые форматы графических данных не позволяют записывать картинки в формате TruColor.
  • Возникает проблема урезания цветового пространства и подбора оптимальной палитры.
  • Пример такого формата — GIF, который ограничивает количество цветов до 256.

Ограничения формата GIF

36:36
  • Формат GIF содержит таблицу из 200 цветов, минимальное количество цветов — два, максимальное — 256.
  • GIF ориентирован на изображения с малым количеством цветов, что позволяет лучше сжимать данные.
  • Формат GIF не поддерживает более 256 цветов для лучшего сжатия.

Архитектура графических приложений

37:31
  • Программа взаимодействует с видеокартой через набор функционала.
  • Операционная система управляет ресурсами, включая видеокарту и экран.
  • Прямой доступ к видеопамяти заблокирован, что ограничивает возможности рисования.

Преимущества разделяемого ресурса

38:30
  • Приложения могут одновременно использовать видеокарту без конфликтов.
  • Вызовы к видеокарте проходят через библиотеку и драйвер.
  • Драйвер обеспечивает фиксированные операции для видеокарты.

Ограничения видеокарт

39:31
  • Видеокарта не всегда может выполнить все графические операции.
  • Для рисования линий используется код, который преобразует возможности видеокарты.
  • Современные библиотеки, такие как DirectX и OpenGL, предоставляют дополнительные функции.

Функции графических библиотек

40:31
  • Библиотеки поддерживают рисование отрезков, фигур, текста и закрашенных областей.
  • Используются кисти для закрашивания и перья для обводки контуров.
  • Некоторые библиотеки позволяют изменять систему координат.

Буферизация и алгоритмы

41:30
  • Буферизация позволяет рисовать кадры в памяти перед выводом на экран.
  • Раньше приложения работали напрямую с экраном, используя сложные алгоритмы отсечения.
  • Современные алгоритмы работают быстрее благодаря удешевлению ресурсов.

Примеры инициализации

43:29
  • Старые видеокарты поставлялись с книжечками, содержащими информацию о графических режимах.
  • Инициализация рисования включала включение режима, установку цвета и рисование линий.
  • Современные библиотеки упрощают работу с графическими режимами.

Развитие графических библиотек

44:35
  • Библиотеки адаптируются под разные системы программирования и ОС.
  • Пример инициализации в старой библиотеке под Linux: включение режима, установка цвета и рисование линии.
  • Современные библиотеки предоставляют более сложные функции для работы с графикой.

Инициализация графического приложения

45:27
  • Фреймворки помогают избежать детальной инициализации графического приложения.
  • Пример программы, которая рисует красную линию на экране.
  • Программа разделена на две части: точка входа и набор действий.

Регистрация окна и цикл обработки событий

46:28
  • Регистрация структуры с описанием окна в системе.
  • Создание физического окна и запуск цикла обработки событий.
  • Программа находится в бесконечном цикле обработки событий.

Обработка сообщений и сигналы

47:22
  • Функция getMessage обеспечивает квазимногозадачность.
  • Обработка сигналов: движение мыши, нажатие клавиш, перерисовка окна.
  • Пример обработки сообщения destroy для выхода из приложения.

Библиотеки и контексты

48:22
  • Библиотеки делятся на работающие с текущим контекстом и использующие DC.
  • DC содержит параметры отображения: цвет, шрифт, способ закраски и т. д.

OpenGL и инициализация

49:32
  • OpenGL обеспечивает интерфейс между приложением и видеокартой.
  • Проблема инициализации графического приложения в разных ОС.
  • Библиотека GLU упрощает инициализацию и регистрацию приложения.

События и колбеки

50:26
  • События устанавливаются с помощью функций обратного вызова колбеков.
  • Пример колбека display для перерисовки окна.

Задание и работа с растровыми алгоритмами

52:26
  • Задание: написать функции для вывода информации на экран с пиксельной точностью.
  • Работа с растровыми алгоритмами: построение изображения по пикселям.

Рекомендованные книги

53:27
  • Книги по компьютерной графике описывают общие подходы и библиотеки.
  • Примеры использования OpenGL для базового вывода на экран.
  • Отечественная книга по выводу графической информации под Windows.

Планы на обсуждение алгоритмов

56:15
  • Обсуждение алгоритмов построения фигур на экране.
  • Рассмотрение алгоритмов построения отрезка прямой и других тем.

Построение отрезка прямой

57:10
  • Задача построения отрезка прямой: по координатам концов отрезка выполнить роторизацию на экране.
  • Экран разбит на пиксели, задача — разместить точки отрезка на экране.
  • Видеокарты используют аналогичные алгоритмы для рисования треугольников.

Алгоритм Line-DA

58:26
  • Идея алгоритма: найти шаг из подобия треугольников и перемещать точки по оси X.
  • Если фигура вытянута по X, точки ставятся по оси X, иногда поднимая Y на следующий уровень.
  • Функция Line-DA позволяет дискретно перебрать целые числа и выполнить линейную интерполяцию.

Алгоритм Брэнхема

1:00:45
  • Рассматривается частный случай: координаты X2 больше X1, Y2 больше Y1, разница по X больше разницы по Y.
  • Из подобия треугольника выводится уравнение, связывающее точки на отрезке прямой.
  • Уравнение используется как оценочная функция для определения положения точки относительно прямой.

Принцип работы алгоритма Брэнхема

1:03:06
  • Алгоритм разработан для плоттеров, где нужно правильно вычислять превращения.
  • На каждом шаге выбирается центральная точка между двумя возможными направлениями.
  • Если точка ниже прямой, выбирается направление северо-восток, если выше — северо-запад.

Оптимизация алгоритма

1:05:01
  • Цель — избавиться от вещественной арифметики.
  • Раскрываются скобки в функции, подставляются координаты точки M.
  • Определяется, как меняются координаты при переходе в точку E или N.
  • Это позволяет оптимизировать алгоритм, избегая использования вещественной арифметики.

Анализ изменения значения функции

1:06:12
  • При переходе по горизонтали значение функции изменяется на величину разницы по Y.
  • При переходе по диагонали разница функций составляет разность между изменением по Y и X.
  • Алгоритм строится на основе начального значения функции F.

Определение начального значения функции

1:07:12
  • Начальная точка: X = 1, Y = 1.
  • Первоначальное значение функции F равно DY - DX / 2.
  • Алгоритм включает расчёт разницы по X и Y, определение количества шагов и изменение значения функции в зависимости от направления движения.

Решение проблемы с вещественными числами

1:08:10
  • Проблема деления пополам решается умножением всех разностей на два.
  • Алгоритм становится более эффективным благодаря фиксированным инкрементам.

Реализация алгоритма на машинном коде

1:09:02
  • Для реализации алгоритма требуется всего один регистр.
  • В архитектуре видеокарты пара X, Y представлена одним значением, равным адресу видеопамяти.
  • Увеличение X или Y осуществляется путём добавления соответствующего значения к адресу.

Использование фиксированной арифметики

1:10:46
  • Вещественные числа имеют недостаток: они требуют дополнительного хранения экспоненты.
  • Фиксированная арифметика позволяет представлять вещественные числа как целые числа с фиксированной точкой.
  • Точность достигается за счёт разделения числа на целую и дробную части.

Применение фиксированной арифметики в алгоритме

1:12:36
  • Сложение и вычитание в фиксированной арифметике выполняются без изменений.
  • Умножение требует дополнительного сдвига позиций.
  • Целая часть числа получается путём сдвига вправо на 16 позиций.
  • Алгоритм остаётся прежним, но вещественные числа заменяются на целочисленные.

Альтернативный подход к дискретизации

1:13:57
  • Сложность алгоритма Беренхема не всегда оправдана.
  • Альтернативный подход позволяет быстро реализовать дискретизацию объектов.
  • Пример с окружностью иллюстрирует применение инкрементального режима для построения математических фигур.

Симметрия и алгоритм построения

1:14:54
  • Алгоритм построения одной из восьми точек, остальные зеркально отображаются.
  • Использование функции «сет пиксель четыре» для установки координат в зависимости от x и y.
  • Симметричное построение точек сверху, слева, снизу и справа.

Параметрический подход

1:15:29
  • Движение точки из координаты 0 по x и радиуса по y вправо до 45 градусов.
  • Возможность параметрического построения с учётом плотности и радиуса.
  • Проблемы оптимальности подхода при выборе шага.

Определение следующей точки

1:17:07
  • Использование уравнения окружности для определения знака функции.
  • Выбор точки для следующего значения на основе знака функции.
  • Пример с точками E и CE для иллюстрации процесса.

Сравнение с алгоритмом для отрезка

1:19:07
  • Аналогия с алгоритмом построения отрезка прямой.
  • Подстановка координат в оценочную функцию для определения направления движения.
  • Различия в изменениях функции при переходе по горизонтали и диагонали.

Учёт координат и памяти

1:20:06
  • Проблема использования внешних координат, которые меняются каждый раз.
  • Необходимость учёта изменений функции в зависимости от координат.
  • Определение начального значения функции до начала построения.

Итоговый алгоритм

1:22:06
  • Начальное значение функции: 1 - r.
  • Построение первых четырёх точек: сверху, снизу, слева, справа.
  • Движение к следующей точке в зависимости от знака функции: вправо-вниз при значении больше нуля.
  • Формулы для изменений координат при переходе.

Оптимизация алгоритма

1:23:11
  • Проблема использования переменных, которые меняются.
  • Идея использования x и y как адресов точек видеопамяти.
  • Планы по оптимизации алгоритма после перерыва.