Базовый курс C++ (MIPT, ILab). Lecture 14 (доп). OpenGL и Vulkan

preview_player
Показать описание
Лекции в бакалавриате МФТИ по C++ на русском языке.

Дополнительный семинар, когда сессия уже (почти) сдана, а семестр ещё далеко -- самое время поговорить об отвлеченных вещах. Например о трёхмерной графике.

Мы рассмотрим OpenGL API, управление окнами через GLFW, расширения через GLEW и glad и про GLSL и шейдеры, после этого подвергнем OpenGL товарищеской критике и поговорим про Vulkan API, тоже с должными подробностями.

Лектор: Константин Владимиров
Дата лекции: 15 января 2022 года
Съёмка: Владислав Белов.
Звук: Дмитрий Рябцев.

Timeline:
00:00 Первый квадрат
09:56 Фиксированный конвейер
14:04 Понятие "расширения"
23:04 Нефиксированный конвейер и вершинные шейдеры
31:35 Фрагментные шейдеры
39:30 Трёхмерная графика
47:52 Culling и Depth
52:05 Логическая модель и проектирование
59:40 Проблемы OpenGL
1:04:38 Vulkan API: основы
1:12:30 Конвейер Вулкана и шейдеры
1:22:00 Цикл отображения и синхронизация
1:31:05 Управление памятью
1:38:38 Пример
1:41:21 Объектная модель Вулкана
1:46:44 VulkanHPP и C++API
1:55:13 Обзор литературы и cliffhanger

Errata:
* Тут пока пусто
Рекомендации по теме
Комментарии
Автор

Это самое лучшее объяснение, лично для меня многие непонятки прояснились.

catalyst
Автор

Ужасно интересно! Трёхкратный прирост впечатлил 👍👍

LeontyevIgor
Автор

Супер лекция!

Mаленькая заметка - в "presént" в значении "представить" ударение идёт на 2 слог а не на 1ый. С ударением на 1 слоге это "подарок" или "настоящее". Кажется мелочью и доебыванием но меня лично это безостановояно сбивало с толку 😂
(ведь буфер мы представляем (presEnt) перед пользователем, а не просим систему дать нам какой-то текущий (prEsent) буфер)

tetraphobie
Автор

Всегда знал что openGL круто но что-то с ним не так! Очень впечатлен обострением проблем и переходом к вулкану. Смотрю про него с интересом! Спасибо!

babichfx
Автор

Прекрасная лекция для введения в графику

MrSnarpix
Автор

Интересно слышать в одном видео про поддержку OpenGL 2.0 и Vulkan) но лекция выглядит очень структурировано, этому стоило бы поучится некоторым

ATtinya-PU
Автор

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

Так что спасибо за эту лекцию, мне была крайне полезна! Ну и Vulkan-hpp реально лучше for use. Она хотя бы чистит все эти сотни структур с заданием sType в рантайме, через которые ты общаешься с API. Уже за это ее можно и нужно юзать в cpp коде.

volodiaagadjanov
Автор

Лекция хороша, но хотелось бы пару замечаний, хоть возможно они и являются чуть большим углублением в вулкан, чем нужно на первой лекции.
Про управление памятью: у вас есть серьёзное ограничение на количество выделяемых блоков (к примеру блоков 2048 на 2070S).
Про вычисления: можно было намекнуть, что мы можем передавать не только матрицы 4х4 но и других размеров, а так же, на сколько помню трёхмерные.

uvash
Автор

Брошу еще камней в огород OpenGL
- Отсутствие пред компилированного байт-кода, как например у DX еще с бородатых времен(Добавили только в 4.6 версии поддержку SPIR-V, особо доставляла функция glLinkProgram)
- Из за сложной стэйт машины высокая нагрузка на CPU, на мобилках это довольно критично
- Неконсистентность самого API

JohnWickMovie
Автор

Как всегда отличная лекция, к сожалению посмотрел далеко не сразу. Оставлю небольшие замечания, чтобы в следующий раз было еще лучше🤓
0. Про небольшое введение в 3d тут написал уже некий You Tube
1. Немного из истории пропущено, между glVertex3fv и VBO были еще функции glVertexPointer, со своими нюансами и непонятками)
2. У меня аж глаз задергался, когда увидел, что мы на каждом кадре делаем glGetUniformLocation()
3. Вы собираетесь на лету менять код шейдера в процессе исполнения программы? Было и такое - генерация специализированных шейдеров, по описаниям, полученным во время работы программы. Но это, конечно же, исключение)
4. 51.20 Это не depth-test пройдет, а face-culling отрежет. Depth буффер пишется после успешного прохождения фрагмента, а здесь фрагменты это только линии.
5. Я не работал еще с Вулканом. Depth-test перенесли до FS? Это же, вроде бы, была оптимизация(Early Fragment Test на сайте хроноса). В вулкане нельзя из фрагментного шейдера менять значение глубины фрагмента?
6. Ускорение при переносе вычислений на GPU вещь очень тонкая и зависит от многих факторов. В плохом случае можно получить даже замедление)

bochkarevartem
Автор

Замечательная лекция! Смотрел большим интересом и почерпнул много интересного. Не могли бы Вы дополнить список литературы каким-нибудь пособием по базовой теории компьютерной графики? Что бы понимать как в теории происходит построение изображений и мочь испльзовать то или иное api осознанно, а не как набор фунций, которые нужно вызвать в определенном порядке.

Log_in_off
Автор

Спасибо большое за лекцию! На OpenGL игрался когда-то, тоже рисовал кубы, а вот про Vulkan было очень интересно послушать.
Если будут ещё доп. семинары по графике, можете осветить тему отрисовки шрифтов? Честно говоря у меня до сих пор нет понимания как рисуются буквы, да ещё и без "лесенок" и прочих артефактов

redfsh
Автор

Очень здорово и огромная благодарность за лекцию! А исходник примера не доступен для ознакомления?

pavelrid
Автор

На 43:43 uniform матрицы умножаются в самом шейдере. Оптимизируют ли как-либо это компиляторы? Мне всегда казалось, что лучше передать предварительно вычисленную матрицу MVP, если есть такая возможность.

sharlodelivron
Автор

на 1:50:00 не понял что мешало им сделать просто оператор для енама без всяких лишних классов. Ну и реализацию to_underlying за одну строку тоже впринципе можно было бы вкинуть, она даже в С++23 есть
template <enumeration T>
constexpr auto to_underlying(T value) noexcept {
return
}
P.S. до С++20 если вы не поставите enable if с проверкой что это enum, то std::underlying_type на не енам ЭТО UB!! Не шучу!
А за лекцию спасибо, давно хотел узнать что то про эти апишки, но нигде нет нормальной информации

niklkelbon
Автор

Glsl ещё и на midl похож своими входными выходными параметрами. Но все же больше на си

pgrytmt
Автор

1:40:10
Дайте угадаю, ускорились за счет UBO рингбуфера? На самом деле на ogl тоже самое можно сделать и не стоит хоронить старичка раньше времени. API оверхед у него конечно больше, но не такой драмматичный как в примере.

dmitry
Автор

извините, я бы хотел понять, почему не стоит производить вычисления на vulkan api?

tpqnwtt
Автор

51:19 а разве отображение задних граней не должен face culling отбрасывать, а не depth test?

pjinkhy
Автор

получается что фрагментные шейдеры имеют квадратичную сложность? O(n^2) (не XOR, а степень)

for(Vertex vert : verticies){
Fragment[] fragments =
for(Fragment frag : fragments){
float[] arr = new float[{0.5}, {0.5}, {0.5 * currentTimeMillis()}, {1.0}];
frag.setColour(arr)
}
}

Спасибо за лекции! С удовольствием их смотрю все! Сложно немного понимать эти функции... почему бы не сделать их более объектно-ориентированными? API OpenGL'а. Извиняюсь за такой глупый вопрос... Но у меня огромное желание изучать все это. Еще раз спасибо!

azatakhunov