Тёмный

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

Konstantin Vladimirov
Подписаться 20 тыс.
Просмотров 24 тыс.
50% 1

Лекции в бакалавриате МФТИ по C++ на русском языке.
Дополнительный семинар, когда сессия уже (почти) сдана, а семестр ещё далеко -- самое время поговорить об отвлеченных вещах. Например о трёхмерной графике.
Мы рассмотрим OpenGL API, управление окнами через GLFW, расширения через GLEW и glad и про GLSL и шейдеры, после этого подвергнем OpenGL товарищеской критике и поговорим про Vulkan API, тоже с должными подробностями.
Лектор: Константин Владимиров
Дата лекции: 15 января 2022 года
Съёмка: Владислав Белов.
Звук: Дмитрий Рябцев.
Предыдущая лекция: • Базовый курс C++ (MIPT...
Следующая лекция: • Базовый курс C++ (MIPT...
Слайды ко всем лекциям: sourceforge.net/projects/cpp-...
Примеры кода ко всем лекциям: github.com/tilir/cpp-graduate
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:
* Тут пока пусто

Опубликовано:

 

17 июл 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 59   
@yakryt7228
@yakryt7228 2 года назад
Отличная премьера, спасибо!
@catalyst1755
@catalyst1755 Год назад
Это самое лучшее объяснение, лично для меня многие непонятки прояснились.
@tetraphobie
@tetraphobie 28 дней назад
Супер лекция! Mаленькая заметка - в "presént" в значении "представить" ударение идёт на 2 слог а не на 1ый. С ударением на 1 слоге это "подарок" или "настоящее". Кажется мелочью и доебыванием но меня лично это безостановояно сбивало с толку 😂 (ведь буфер мы представляем (presEnt) перед пользователем, а не просим систему дать нам какой-то текущий (prEsent) буфер)
@LeontyevIgor
@LeontyevIgor 2 года назад
Ужасно интересно! Трёхкратный прирост впечатлил 👍👍
@tilir
@tilir 2 года назад
Тут в комментариях уже обнаружилось что такие цифры скорее от того, что я несколько недожал в OpenGL части. Попытаюсь наверстать к следующему году =)
@babichfx
@babichfx 2 года назад
Всегда знал что openGL круто но что-то с ним не так! Очень впечатлен обострением проблем и переходом к вулкану. Смотрю про него с интересом! Спасибо!
@babichfx
@babichfx 2 года назад
Ооочень ждал после анонса!
@usercommon1
@usercommon1 2 года назад
вотэта мне надо такое
@ATtiny13a-PU
@ATtiny13a-PU Год назад
Интересно слышать в одном видео про поддержку OpenGL 2.0 и Vulkan) но лекция выглядит очень структурировано, этому стоило бы поучится некоторым
@MrSnarpix
@MrSnarpix 2 года назад
Прекрасная лекция для введения в графику
@helloworld-fv8kx
@helloworld-fv8kx Год назад
Вы уверенны что это прекрасная лекция для ВВЕДЕНИЯ в графику ?
@bochkarevartem
@bochkarevartem 2 года назад
А теперь проверка ссылки на другое видео: ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-J6SNO5o9ADg.html
@bochkarevartem
@bochkarevartem 2 года назад
Комменты с ссылками на godbolt молча удаляются, комменты с ссылками на другие youtube видео выживают)
@volodiaagadjanov7087
@volodiaagadjanov7087 2 года назад
Пытался залезть на Vulkan раньше, не получалось никак. Код ну просто чудовищен, вообще официальные туторы отбивают желание этим заниматься. Туда напихивают сразу же и слои валидации, и всю работу с экстеншенами. Как говорит Константин, "Путь до первого треугольника", с офф туторами это просто минное поле из тонн неструктурированного грязного кода. Так что спасибо за эту лекцию, мне была крайне полезна! Ну и Vulkan-hpp реально лучше for use. Она хотя бы чистит все эти сотни структур с заданием sType в рантайме, через которые ты общаешься с API. Уже за это ее можно и нужно юзать в cpp коде.
@ea8265
@ea8265 Год назад
А по Vulkan-hpp есть доки?
@bochkarevartem
@bochkarevartem 2 года назад
Как всегда отличная лекция, к сожалению посмотрел далеко не сразу. Оставлю небольшие замечания, чтобы в следующий раз было еще лучше🤓 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 вещь очень тонкая и зависит от многих факторов. В плохом случае можно получить даже замедление)
@tilir
@tilir 2 года назад
Отличный комментарий, спасибо. Я надеялся что придут люди, которые лучше знают графику -- для меня-то и шейдеры это не код это тесты для компилятора =) (0) Я рассматриваю всю эту лекцию как небольшое введение в 3d (1) Я думал. Не влезло бы и в наши дни уже, наверное, не слишком актуально. Или ещё используется? (2) Упс. Спасибо. Я чего-то тоже это только что осознал. Но, кстати, Дима в его примере так не делает. (3) Учитывая specialization constants в SPIRV менять код на лету уже не слишком нужно. (4) Я был уверен, что именно depth даёт артефакты. Но для линий наверное да, он не при чём. (5) Там как-то сложно. С одной стороны gl_FragDepth всё так же доступен разумеется, GLSL никто не менял. Но с другой стороны depth test действительно идёт раньше. Надо почитать спеку, может ещё разок пересчитывается позднее? (6) Да, конечно
@bochkarevartem
@bochkarevartem 2 года назад
@@tilir 1. Ну, на предыдущей моей работе оно до сих пор используется в режиме compatibility profile при некоторых плохих условиях. Просто это неплохой логический переход. В начале веков было так, потом решили сделать glVertexPointer(). Но эта функция весьма магическая и непонятно, что она в реальности делает. И тогда придумали нормальные VBO) 2. Я бы глянул на код примера, он есть в материалах примера? Но думаю, там все хорошо) 3. Я делал нечто, что называют functional textures. По описанию штрихованных линий генерировал код фрагментного шейдера, который обычные линии превращает в пунктирные. А так да, ради констант любят шейдеры перекомпилировать. 5. Думаю, изменение глубины во фрагментном шейдере мало распространено, поэтому обычно тест идет до. Но у программы есть флажок, меняет ли она глубину, и depth-test в таком случае будет работать не до, а после фрагментного шейдера. Но раз в норме он идет до, то на картинках так и указывают.
@JohnWickMovie
@JohnWickMovie 2 года назад
Брошу еще камней в огород OpenGL - Отсутствие пред компилированного байт-кода, как например у DX еще с бородатых времен(Добавили только в 4.6 версии поддержку SPIR-V, особо доставляла функция glLinkProgram) - Из за сложной стэйт машины высокая нагрузка на CPU, на мобилках это довольно критично - Неконсистентность самого API
@uvash4611
@uvash4611 2 года назад
Лекция хороша, но хотелось бы пару замечаний, хоть возможно они и являются чуть большим углублением в вулкан, чем нужно на первой лекции. Про управление памятью: у вас есть серьёзное ограничение на количество выделяемых блоков (к примеру блоков 2048 на 2070S). Про вычисления: можно было намекнуть, что мы можем передавать не только матрицы 4х4 но и других размеров, а так же, на сколько помню трёхмерные.
@tilir
@tilir 2 года назад
Да, про управление памятью это вообще огромная тема. Есть целые библиотеки которые используются практически чтобы упростить управление памятью в вулкане.
@redf1sh
@redf1sh Год назад
Спасибо большое за лекцию! На OpenGL игрался когда-то, тоже рисовал кубы, а вот про Vulkan было очень интересно послушать. Если будут ещё доп. семинары по графике, можете осветить тему отрисовки шрифтов? Честно говоря у меня до сих пор нет понимания как рисуются буквы, да ещё и без "лесенок" и прочих артефактов
@tilir
@tilir Год назад
Я там в конце книжку порекомендовал как раз по этому вопросу. Базовые алгоритмы компьютерной графики очень интересны.
@fyfbifvodefin9383
@fyfbifvodefin9383 11 месяцев назад
Ничего сложного, сначала загружается шрифт, а потом все символы, которые поддерживает этот шрифт переносятся на текстурный атлас. Ну а дальше не трудно догадаться, что просто на экране на месте символов рисуются квадраты с наложенными текстурами букв из текстурного атласа. Вот и всё
@pavelrid
@pavelrid 2 года назад
Очень здорово и огромная благодарность за лекцию! А исходник примера не доступен для ознакомления?
@tilir
@tilir 2 года назад
Да я форкнул на свой гитхаб тот снимок с проекта Димы который был актуален на момент записи лекций: github.com/tilir/3d-render-examples ну и там можете перейти в апстрим, работа в процессе.
@pavelrid
@pavelrid 2 года назад
@@tilir благодарствую!
@Log_in_off
@Log_in_off Год назад
Замечательная лекция! Смотрел большим интересом и почерпнул много интересного. Не могли бы Вы дополнить список литературы каким-нибудь пособием по базовой теории компьютерной графики? Что бы понимать как в теории происходит построение изображений и мочь испльзовать то или иное api осознанно, а не как набор фунций, которые нужно вызвать в определенном порядке.
@user-yw2ub8mb5b
@user-yw2ub8mb5b 4 месяца назад
Алексей Боресков - Программирование компьютерной графики, 2019 Небольшая, но довольно неплохая книга по введению в компьютерную графику. В книге рассматриваются различные алгоритма и структуры данных, используемых в графике, рассматривается рейтрейсинг, и основы современного opengl.
@Log_in_off
@Log_in_off 4 месяца назад
@@user-yw2ub8mb5b Благодарю за рекомендацию!
@sharlodelivron7294
@sharlodelivron7294 2 года назад
На 43:43 uniform матрицы умножаются в самом шейдере. Оптимизируют ли как-либо это компиляторы? Мне всегда казалось, что лучше передать предварительно вычисленную матрицу MVP, если есть такая возможность.
@tilir
@tilir 2 года назад
Я с вами до какой то степени согласен. Мы во первых делаем уйму повторяющейся работы в каждом потоке, во вторых гоним на GPU втрое больше данных. Но я не смог устоять -- мне нужен был пример нетривиального вершинного шейдера.
@niklkelbon3662
@niklkelbon3662 2 года назад
на 1:50:00 не понял что мешало им сделать просто оператор для енама без всяких лишних классов. Ну и реализацию to_underlying за одну строку тоже впринципе можно было бы вкинуть, она даже в С++23 есть template constexpr auto to_underlying(T value) noexcept { return static_cast(value); } P.S. до С++20 если вы не поставите enable if с проверкой что это enum, то std::underlying_type на не енам ЭТО UB!! Не шучу! А за лекцию спасибо, давно хотел узнать что то про эти апишки, но нигде нет нормальной информации
@tilir
@tilir 2 года назад
Идея оператора для enum class плоха вот чем: у вас есть флаги A, B, C но например A | B уже не член enum class и мы не хотим чтобы он им был. Поэтому у нас есть enum class для индивидуальных возможных флагов и отдельный класс который хранит underlying type для их комбинаций.
@user-tp1qn2wt6t
@user-tp1qn2wt6t 2 года назад
извините, я бы хотел понять, почему не стоит производить вычисления на vulkan api?
@tilir
@tilir 2 года назад
Вычисления на vulkan проводить вполне можно. Но не являясь специализированным API для compute, Vulkan для этого является немыслимо тяжёлым выбором. 9-12 слайды отсюда дают представление о том что хорошо для компьюта и почему: www.iwocl.org/wp-content/uploads/iwocl-syclcon-2020-meyer-11-slides.pdf Обычный сценарий компьюта на Вулкане это примерно так: у вас уже есть игра с 3D обработкой и вы дописываете в ту же систему ещё и шейдер для вычислений. Стартовать же на вулкане именно вычислительный проект это странно.
@user-pj7in9kh7y
@user-pj7in9kh7y 2 года назад
51:19 а разве отображение задних граней не должен face culling отбрасывать, а не depth test?
@tilir
@tilir 2 года назад
Ради интереса погуглите z-fighting =)
@user-pj7in9kh7y
@user-pj7in9kh7y 2 года назад
@@tilir а это то тут при чем? Тут же не будет двух точек куба, которые при проецировании попадут в один пиксель, с одинаковой глубиной? А на видео видно именно отсечение ребер невидимых граней куба.
@user-pg8ry1tm3t
@user-pg8ry1tm3t 3 месяца назад
Glsl ещё и на midl похож своими входными выходными параметрами. Но все же больше на си
@dmitry6123
@dmitry6123 2 года назад
1:40:10 Дайте угадаю, ускорились за счет UBO рингбуфера? На самом деле на ogl тоже самое можно сделать и не стоит хоронить старичка раньше времени. API оверхед у него конечно больше, но не такой драмматичный как в примере.
@tilir
@tilir 2 года назад
Расскажите вкратце как это сделать на opengl, постараюсь улучшить честность сравнения.
@dmitry6123
@dmitry6123 2 года назад
@@tilirПринцип такой же - пока GPU читает один буфер, пишем в следующий и так по кругу. Кроме того не использовать Buffer|Sub|Data, а мапить единожды содержимое на cpu с флагами persistent и coherent. Здесь главное понять где ogl расставляет имплисит синкпоинты cpu-gpu. Хоть и нет возможности ими управлять, как в Vulkan'е, но контролировать извне их вполне возможно.
@azatakhunov6061
@azatakhunov6061 Год назад
получается что фрагментные шейдеры имеют квадратичную сложность? O(n^2) (не XOR, а степень) for(Vertex vert : verticies){ Fragment[] fragments = getAllNearFragmentsToNextVerticies(vert); for(Fragment frag : fragments){ float[] arr = new float[{0.5}, {0.5}, {0.5 * currentTimeMillis()}, {1.0}]; frag.setColour(arr) } } Спасибо за лекции! С удовольствием их смотрю все! Сложно немного понимать эти функции... почему бы не сделать их более объектно-ориентированными? API OpenGL'а. Извиняюсь за такой глупый вопрос... Но у меня огромное желание изучать все это. Еще раз спасибо!
@tilir
@tilir Год назад
Вы пропустили растеризатор. Он строит по вершинам массив фрагментов и дальше он уже параллелится по фрагментному процессингу. Что до API... я вроде на первых же лекциях объясняю почему все нормальные API вынужденно сишные. Дело в манглировании.
@azatakhunov6061
@azatakhunov6061 Год назад
@@tilir спасибо большое! Сейчас посмотрю.
@yakryt7228
@yakryt7228 2 года назад
А правильный ответ на вопрос, озвученный в конце лекции, мы узнаем в следующей серии ? :)
@tilir
@tilir 2 года назад
Следующая лекция как раз про компьют. А что за вопрос вы имеете в виду?
@yakryt7228
@yakryt7228 2 года назад
@@tilir Вопрос про то, на сколько процентов на гпу будет быстрее чем на цпу. У меня есть еще один вопрос, не относящейся к данной теме. Я его под лекцией по метапрограммированию написал, но, видимо, у Вас не было оповещения о комментарии или по каким-то причинам оно затерялось. Я тут вопрос продублирую, т.к. как-то иначе не могу дать на него ссылку, если Вас не затруднит, прокомментируйте пожалуйста. Вопрос об использовании типов unit32_t, int32_t и им подобных. Вы не рекомендуете использование данных типов, но в c++ core guidelines в разделе Р.5 рекомендуют в похожем случае (ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-UJqW_eEBA6I.html тайминг по лекции по мете, лекция номер 16) использование именно int32_t. Сможете как-то прокомментировать? Возможно, я что-то не правильно понял.
@tilir
@tilir 2 года назад
@@yakryt7228 про int32_t я вроде уже отвечал, но я ответил вам в ту ветку. Я не слишком высоко ценю эти самые core guidelines. Сравнение производительности GPU и CPU конечно будет на лекции по компьюту. Коротко -- для тех вычислительных задач, для которых GPU подходит, оно в разы лучше. Но оно подходит не для всех задач. Матрицы перемножить -- очень хорошо. А вот что-то другое -- надо смотреть отдельно.
@yakryt7228
@yakryt7228 2 года назад
​@@tilir Спасибо и за ответ на тот вопрос, и про вычисления на гпу. Ждем с нетерпением следующей лекции :)
@aleonaxel
@aleonaxel 6 месяцев назад
@@tilir "Я не слишком высоко ценю эти самые core guidelines." А можно с этого места подробнее?)) Их вроде пишут (сами!) Саттер и Страуструп.
@EugeneStanch
@EugeneStanch 4 месяца назад
Какой у вас опыт в программирование, начиная с любительской лиги ? Хочется стать таким же опытным человеком🙄
@tilir
@tilir 4 месяца назад
У меня есть интервью (см. на коммьюнити-вкладке канала) где я рассказываю про свой опыт.
@Kirkezz
@Kirkezz Год назад
note: 3730
@lotierm
@lotierm 2 года назад
Ну блин сколько можно в этих notepad+++ рабоать, кровь с глаз же.
@tilir
@tilir 2 года назад
Я работаю в vim. Проблема в том что на лекции у меня нет полноценной клавиатуры, а показывать вещи надо быстро. Поэтому npp. Если у вас есть другие предложения -- озвучьте.
@lotierm
@lotierm 2 года назад
@@tilir vs code
@defalko6526
@defalko6526 9 месяцев назад
Разве тут не glGetProgramiv? cpp-graduate/10-3d/ogl-frag-shader . cc:145
Далее
Minecraft Pizza Mods
00:18
Просмотров 2,2 млн
What Can Vulkan do for You? - Jason Ekstrand, Intel
57:56
2017 DevU - 01 Getting Started with Vulkan
1:11:12
Просмотров 50 тыс.
Vulkanised 2023 Tutorial: An Introduction to Vulkan
1:20:42