Компьютерная графика
§ 12 Графические процессоры
Графические ускорители
Графические ускорители
Графический процессор
GPU nVidia GeForce 3 (2001 год)
Шейдеры
Графический конвейер
Графический конвейер
Вершинный шейдер
Фрагменты
Фрагментный шейдер
Буферы
Фреймбуфер
Фреймбуфер
Устройство GPU
Устройство GPU
Устройство мультипроцессора
Устройство мультипроцессора
GPGPU
OpenGL
OpenGL
Основные возможности OpenGL
Дополнительные библиотеки OpenGL
478.00K
Категория: ПрограммированиеПрограммирование

Тема №12. Графические процессоры

1. Компьютерная графика

Москин Николай Дмитриевич
Институт математики и информационных
технологий
Петрозаводский государственный университет
1

2. § 12 Графические процессоры

Изначально весь расчет графики целиком
выполнялся центральным процессором (Central
Processor Unit, CPU). Графический ускоритель для
персонального компьютера в те времена
обеспечивал только доступ процессора к
видеопамяти и ее отображение на экране.
Однако позднее возможности графических
ускорителей принципиально изменились, они
стали программируемыми, и для них сейчас
используется термин графический процессор
(Graphics Processing Unit, GPU).
2

3. Графические ускорители

Первые ускорители трехмерной графики (напри-
мер, Voodoo) обладали очень ограниченными
возможностями: фактически, они могли быстро
выполнять только растеризацию, удаление
невидимых поверхностей при помощи z-буфера,
наложение текстур на грани и поддержку
полупрозрачности.
Однако даже графические ускорители с такими
ограниченными возможностями давали заметный
рост скорости рендеринга и позволяли разгрузить
центральный процессор.
3

4. Графические ускорители

Дальнейшее развитие шло по 2 направлениям:
рост скорости вывода большего количества
треугольников в секунду и пикселов в секунду.
повышение гибкости (возможности выполнять
наборы операций прямо на графическом
ускорителе).
Появились графические ускорители, способные
выполнять ряд базовых преобразований и
производить повершинный расчет освещенности
(при закрашивании Гуро) непосредственно на
самом графическом ускорителе.
4

5. Графический процессор

Однако и этой гибкости оказалось недостаточно.
Наибольшая возможная гибкость для устройства
– это возможность программировать его, когда
логика работы устройства задается с помощью
программы.
В результате появились программируемые
графические ускорители, для обозначения
которых и стал использоваться термин
«графический процессор» (Graphics Processing
Unit, GPU).
5

6. GPU nVidia GeForce 3 (2001 год)

6

7. Шейдеры

Первые программируемые графические
процессоры поддерживали только
программируемую обработку вершин, но вскоре
появились графические процессоры, в которых
обработка фрагментов, получаемых при
растеризации, также стала полностью
программируемой.
Соответствующие программы, обрабатывающие
вершины и фрагменты, стали называть шейдеры
(shader).
7

8. Графический конвейер

Современный GPU содержит большое количество
вычислительных блоков, способных параллельно
обрабатывать большой объем данных, снабжен
аппаратным растеризатором, аппаратной
поддержкой удаления невидимых поверхностей с
помощью буфера глубины и блоками доступа к
текстурам.
На рисунке изображен графический конвейер
современных GPU. Он показывает, каким образом
обрабатываются данные, поступающие на вход
GPU.
8

9. Графический конвейер

9

10. Вершинный шейдер

На вход поступают данные, заданные в вершинах
многоугольников, а также информация о том, как
из этих вершин следует собирать треугольники.
Данные в вершинах обрабатываются посредством
вершинного шейдера.
Вершинный шейдер вызывается для каждой
поступающей на вход вершины. Он должен
вычислить ее однородные координаты с учетом
всех преобразований, которые будут
использованы далее для отсечения геометрии и
растеризации.
10

11. Фрагменты

После выполнения вершинного шейдера вершины
собираются в треугольники и поступают на
стадию отсечения, в результате которой все части,
выходящие за границы области видимости, будут
отрезаны.
После этого геометрические примитивы
растеризуются. В результате получается набор
фрагментов – того, что может потом стать
пикселами, если они не будут отброшены в
результате различных тестов.
11

12. Фрагментный шейдер

Для каждого фрагмента выполняется
фрагментный шейдер, получающий на вход
значения, рассчитанные путем интерполяции
выходных значений вершинного шейдера.
Задача фрагментного шейдера – вычислить
итоговый цвет фрагмента, используя эти
значения. После этого фрагмент проходит через
группу тестов. В результате каждого из этих тестов
фрагмент может быть полностью отброшен.
12

13. Буферы

Далее фрагмент, успешно прошедший все тесты,
накладывается на значение в буфере цвета:
некоторые операции могут потребовать перед
записью прочесть текущее значение из буфера,
используя его и текущее значение для фрагмента,
вычислить новое значение и записать его в
буфер.
Видеопамять состоит из нескольких массивов
(буферов), каждый из которых сопоставляет
каждому пикселу определенное значение.
13

14. Фреймбуфер

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

15. Фреймбуфер

Фрагмент, поступающий во фреймбуфер, может
изменить любой из этих буферов (например,
записать значения цвета и глубины и увеличить на
единицу значение в буфере трафарета).
Соответственно, современные GPU имеют
аппаратную поддержку растеризации примитивов,
удаления невидимых поверхностей с помощью zбуфера, наложения цветов с учетом
полупрозрачности (альфа-блендинг).
15

16. Устройство GPU

Современный GPU является массивно-
параллельным вычислительным устройством – он
способен параллельно выполнять большое число
операций. В состав GPU входит большое
количество процессоров (ядер), способных
параллельно обрабатывать вершины и
фрагменты.
Несмотря на множество таких процессоров,
количество блоков декодирования команд и
управления намного меньше, чем число ядер.
16

17. Устройство GPU

Обычно ядра группируются, и на группу ядер
приходится всего один блок декодирования и
управления. Т. е. каждая такая группа ядер
одновременно выполняет одну и ту же команду
(подобная архитектура обычно называется SIMD,
Single Instruction Multiple Data).
Рассмотрим устройство мультипроцессора (на
рисунке не отображены блоки растеризации и
работы с текстурами, показана только
вычислительная часть).
17

18. Устройство мультипроцессора

Устройство
потокового
мультипроцессора
для GPU GeForce
8800 – весь GPU
состоит из набора
таких мультипроцессоров.
18

19. Устройство мультипроцессора

Каждый мультипроцессор состоит из набора
скалярных ядер (SP), блока декодирования
очередной команды (Instruction Fetch),
разделяемой памяти (Shared Memory), которая
может совместно использоваться ядрами, набора
регистров (Register File) и специальных ядер для
работы с трансцендентными функциями (SFU).
Несмотря на то, что архитектура GPU может
отличаться от приведенной на рисунке, общий
подход остается таким же.
19

20. GPGPU

За счет наличия большого количества
процессоров современные GPU в десятки раз
обходят по быстродействию традиционные CPU.
Появилось целое направление – GPGPU (Generalpurpose computing for graphics processing units,
неспециализированные вычисления на
графических процессорах), посвященное
использованию GPU для решения различных
неграфических задач.
Для этой цели существуют специальные API,
такие как OpenCL (Open Computing Language) и
CUDA (Compute Unified Device Architecture).
20

21. OpenGL

GPU могут сильно различаться между собой,
поэтому напрямую с GPU обычно не работают, а
используют специализированные API (application
programming interface).
Примером такого API, предназначенного для
решения графических задач, является OpenGL
(Open Graphics Library) – открытый,
платформенно-независимый интерфейс для
большого количества платформ и языков.
21

22. OpenGL

Стандарт был разработан в 1992 году на основе
библиотеки IRIS GL, созданной компанией Silicon
Graphics. Последняя версия OpenGL 4.6 вышла в
июле 2017 года. Включает более 300 функций для
рисования сложных трёхмерных сцен из простых
примитивов. Основным принципом работы
OpenGL является получение наборов векторных
графических примитивов в виде точек, линий и
многоугольников с последующей математической
обработкой полученных данных и построением
растровой картинки на экране и/или в памяти.
http://www.opengl.org/
22

23. Основные возможности OpenGL

Набор базовых примитивов: точки, линии, много-
угольники и т.д.;
Видовые и координатные преобразования;
Удаление невидимых линий и поверхностей (zбуфер);
Использование сплайнов для построения линий и
поверхностей;
Наложение текстуры и применение освещения;
Добавление специальных эффектов: тумана,
изменение прозрачности, сопряжение цветов
(blending), устранение ступенчатости (antialiasing).
23

24. Дополнительные библиотеки OpenGL

Существует ряд библиотек, созданных в дополнение к стандартных функциям OpenGL: GLU, GLUT,
SDL, GLEW и др.
GLU (OpenGL Utility Library) – содержит большое
количество функций: создание текстур, рисование
квадратичных поверхностей, расширенный набор
функций трансформации для установки точек
обзора и более простого управления камерой,
дополнительные графические примитивы (сфера,
цилиндр, конус), интерпретация кодов ошибок
OpenGL и др.
24
English     Русский Правила