Ребята, всем привет!!!
Выдалась у меня свободная минута и решил я собрать небольшой гайд на прохождение собеседования по направлению программиста 3D графики для GameDev компаний. Сам я работаю в данной сфере и очень много общаюсь с различными людьми, теми кто только приходит собеседования и теми, кто уже трудится достаточно давно и за плечами не один выполненный проект и множество решенных рабочих вопросов и задач. Если вам интересная данная тема, то прошу всех под кат.
Для большинства компаний принято разделять данную профессию/направление на два:
Первые - это специалист игровой графики и Вторые - это специалисты компьютерной графики. В чем же разница? Скажем так, первое является закономерным продолжением второго, но не всегда. Например, вы начинаете работать как VFX специалист, создаете партикловые (частицы) эффекты, "прикручиваете" к ним трехмерные модели, собираете все из частей, пишите шейдера и работаете с кодовой базой. То есть здесь вы больше сконцентрированы на визуальном оформлении игры и отдельных ее элементах. В ваши задачи входит разработка визуальных эффектов на "приемлемом" уровне с учетом общей стилистики игры, ее жанра, цветового оформления (хорор, mathc-3d, ферма, песочница и т.д.). Вопросы оптимизации, здесь важны, но они не так глобальны;
![Эффекты могут быть самыми разными (дым, огонь, лава, магия, слизь, взрывы и т.д.) разработка и качество полностью лежит на плечах специалиста по игровой графике Эффекты могут быть самыми разными (дым, огонь, лава, магия, слизь, взрывы и т.д.) разработка и качество полностью лежит на плечах специалиста по игровой графике](https://habrastorage.org/getpro/habr/upload_files/c29/8b9/6ee/c298b96ee19b0c0c52e2b14b24f169b9.png)
Вторые - это программисты игровой графики, которые занимаются вопросами оптимизации игры в целом и отдельных ее частей уже больше под железо (смартфоны/планшеты/пк). То есть здесь основной упор ставится на плотную работу с оптимизацией, рендерингом, работу с шейдерами, текстурами, светом, тенями, отражениями, вопросами нагрузочного тестирования (когда, например, на карте, одно моментно появляется множество персонажей или происходит какая-то эпическая битва со множеством действий (магия, стрелы и т.д.), а так же обработка графики в целом.
Много времени уделяется оптимизации пайплана разработки, анализу производительности устройств, на которые игра будет портироваться. Так же оценивается стабильность, скорость, наличие багов и артефактов на изображении, а самое главное, сохранение всей той красоты, которая была заложена различными специалистами при создании игры: моделлерами, VFX, текстурщиками, художниками, программистами и т.д.;
На первую позицию, как правило требуются люди, которые уже работали с игровыми движками (Unity / Unreal / Cryengine) и имеют представление об общем пайплайне разработки, тогда как, на вторую идут люди, которые имеют уже наработанный опыт работы в gamedev (не только с движками) и это является для них логичными продолжением, либо кто много работал кодом и немного с графикой.
В этой публикации я хотел бы рассмотреть именно второе направление и показать с какими вопросами я столкнулся на различных собеседованиях и разговорах со специалистами в разнообразных интервью. Бывает так, что эти две специальности объединяют в одну, но такое встречается не часто. Надеюсь информация, здесь и ниже, окажется вам полезной;
![Здесь на первый план выходят вопросы, насколько качественно и корректно все отображается (тени, рендринг, освещение, идет глубокая работа со слоями, оценкой трассировки лучей, качеством сглаживания текстур и т.д.) Здесь на первый план выходят вопросы, насколько качественно и корректно все отображается (тени, рендринг, освещение, идет глубокая работа со слоями, оценкой трассировки лучей, качеством сглаживания текстур и т.д.)](https://habrastorage.org/getpro/habr/upload_files/bc9/216/b01/bc9216b0179f8d4ec7ffafcd19a0b510.png)
Если говорить кратко, то все вопросы можно разделить на несколько отдельных подразделов, а именно: языки программирования (С++, С#, Python), оптимизация (профилировщики, оценка производительности, чистота кода, паттерны проектирования, ООП, стандарты и алгоритмы); графика (3D приложения для моделирования и симуляции, пайплайн разработки эффекта/модели, шейдеры, эффекты, текстуры); математика (вектора, матрицы, геометрия, представление пространства), система контроля версий. Уровень вопросов, то есть на какую позицию претендует человек, оценивается в каждой компании по разному, будь-то beginner, junior, middle, senior или lead. Здесь больше вопросы для джунов и мидлов;
С++
- Что такое виртуальные деструкторы и когда их можно использовать?;
Деструкторы - это функция вызывающаяся автоматически, когда объект или класс выходит из области действия и уничтожается вызовом метода delete. Деструктор имеет то же имя, что и класс, перед которым стоит тильда. Деструкторы не могут иметь аргументов и не возвращают значение. Они не могут быть объявлены как const, volatile, statistic, но могут быть объявлены как Virtual. Каждый класс может иметь только один деструктор, его применяют если базовый класс предназначен для полиморфного использования, то его деструктор должен объявляться как виртуальный;
![Деструктор С++ Деструктор С++](https://habrastorage.org/getpro/habr/upload_files/df3/3a9/de9/df33a9de90250b62a018658e0ccd9db6.png)
- Что такое лист, массив?;
Лист (список) - это контейнер/хранилище элементов одинакового типа, который представляет собой двусвязный/односвязный список (слева-направо и справо-налево) - это сущность, где каждый отдельный внутренний элемент имеет прямую связь со своими соседствующими элементами, при этом любые не соседствующие элементы ничего не знаю о друге о друге.
Отличительные особенности списка: 1. Отсутствие произвольного доступа к элементам, но доступ к первому и последнему; 2. Вставка и удаление выполняются за константное время с поддержкой обработки исключений; 3. Все операции сводятся к манипулированию указателем без определения емкости и перераспределения памяти; 4. Каждый объект внутри списка занимает свою собственную ячейку памяти;
Массив - непрерывный участок памяти, содержащий последовательность объектов одинакового типа. Отличительные особенности массива: 1. Есть возможность получить доступ ко все элементам массива через использование одного идентификатора; 2. Каждый элемент массива характеризуется следующими параметрами: адрес элемента в памяти, порядковый номер в массиве, значение элемента, размер массива и элемента; 3. Есть поддержка многомерных массивов и динамических в с++;
![C++ является стандартом программирования наряду с С# и Python в GameDev C++ является стандартом программирования наряду с С# и Python в GameDev](https://habrastorage.org/getpro/habr/upload_files/24c/463/bce/24c463bce43e30e2865f124ee16c2198.png)
- Что такое паттерны проектирования?;
Паттерны проектирования (ПП) это часто встречающиеся решение определенной проблемы при проектировании архитектуры программ. Это не столько алгоритмы, они описывают общее высокоуровневое решение вопроса разработки и состоят из проблемы, которую решает паттерн, мотивации к решению проблемы определенным способом, структуры классов, составляющих решение, особенностей реализации в различных контекстах и связей с другими патернами. Они позволяют использовать проверенные решения, производя стандартизацию кода и используя общий словарь разработчика/программиста. ПП бывают: поведенческие, порождающие и структурные. Часто ПП применяются при рефакторинге;
- Часто в коде используется слово inline - какую функцию оно выполняет?;
inline используется для компилятора, чтобы он рассматривал функцию как встроенную. Плюсом является то, что вызов функции заменяется копией содержимого самой функции при компиляции, и ресурсы, которые могли бы быть потрачены на вызов сохраняются. Минусом является увеличение компилируемого кода, за счет того, что встроенная функция раскрывается при каждом вызове;
![Конструктор Account является встраиваемой функцией. Функции члена GetBalance , Deposit и Withdraw не указаны как, inline, но могут быть реализованы как встроенные функции Конструктор Account является встраиваемой функцией. Функции члена GetBalance , Deposit и Withdraw не указаны как, inline, но могут быть реализованы как встроенные функции](https://habrastorage.org/getpro/habr/upload_files/c89/95e/7f1/c8995e7f1e30347dc60818fba8827636.png)
- Битовые перестановки: как из 1100 0000 превратить в 0000 0011?;
Есть два варианта либо "загнать" это в массив и работать с элементами массива, либо пользоваться битовыми перестановками;
- Структуры данных и тип данных что есть что?
Структура данных - это контейнер, который хранит данные в определенном макете. Основные структуры данных: массивы, стеки, очереди, связные списки, графы, деревья, префиксные деревья, хэш-таблицы;
Каждая переменная имеет свой тип, это определяет какие операции над ней можно производить, сколько байт она занимает в памяти, какие значения может иметь данная переменная. Различают следующие типы: целочисленные, с плавающей точкой, логический, символьный, специальные;
![C++ содержит очень гибкую систему для разработки, имеет множество инструментов и подходов к реализации приложений и программных решений, для новичка он может показаться немного трудным для освоения и потребовать дополнительных временных затрат и освоения кодовой базы C++ содержит очень гибкую систему для разработки, имеет множество инструментов и подходов к реализации приложений и программных решений, для новичка он может показаться немного трудным для освоения и потребовать дополнительных временных затрат и освоения кодовой базы](https://habrastorage.org/getpro/habr/upload_files/a31/8fd/99d/a318fd99d298fe7510bbbc4e0c2a58cf.png)
- Указатели в С++, что это и какие бывают?;
Указатель - это переменная, значением которой является адрес ячейки памяти, они объявляются также как и обычные переменные. Наиболее распространенные: & (адрес) - позволяет указать какой адрес присвоен определенной переменной, * (разыменовывания) - позволяет получить значение по указанному адресу;
- Метапрограммирование и многопоточное программирование чем они отличаются;
Метапрограммирование - это написание промежуточной программы, результатом которой будет другая часть программы (шаблоны C++). Вместо написания десяти одинаковых функций для разных типов, мы пишем шаблон, и компилятор сам соберет нам эти 10 функций;
Многопоточное программирование/многопоточность - свойство платформы или приложения, состоящее в том, что процесс, порожденный в системе, может состоять из нескольких потоков, выполняющихся "параллельно", то есть без предписанного порядка во времени (thread). На одном процессоре, многопоточность реализуется путем временного мультиплексирования;
- Почему нельзя бросать исключения в деструкторе?;
Потому что в деструктор можно попасть во время раскрутки стека при уже выброшенном исключении, и если в этот момент будет выброшено ещё одно исключение, в результате будет вызван std::terminate();
- Виртуальная функция, как она может быть реализована и для чего нужна?;
Это особый тип функции, которая при вызове, выполняет "наиболее" дочерний метод, который существует между родительскими и дочерними классами. Дочерний метод вызывается тогда, когда совпадает сигнатура (имя, тип параметров и т.д.) и тип возврата дочернего метода с сигнатурой и типов возврат метода родительского класса. Такие методы называются переопределенными.
Для объявления функции необходимо использовать слово virtual. Функция-член класса может быть объявлена как виртуальная, если: 1. Класс, содержащий виртуальную функцию, базовый в иерархии порождения; 2. Реализация функции зависит от класса и будет различной в каждом порожденном классе;
![Неплохая книга по многопоточному программированию Неплохая книга по многопоточному программированию](https://habrastorage.org/getpro/habr/upload_files/8da/ade/b2f/8daadeb2f1b7a0b8984c297f985c4138.png)
Компьютерная графика
- Опишите пайплайн разработки VFX эффекта?;
Разработка концепта эффекта, оценка из чего будет состоять эффект, разработка 3D/2D модели, разработка партикловых эффектов, сведение модели и партиклов, цветокоррекция по всем частям и компановка объекта, написание скрипта по управлению эффектом, оценка производительности и оптимизация: снижением количества полигонов и партиклов, оптимизация кода, цветокоррекция и работа со светом и тенями, оценка насколько органично эффект вписывается в пайплайн и общую стилистику игры;
![Общий графический пайплайн реализованный на Vulkan API Общий графический пайплайн реализованный на Vulkan API](https://habrastorage.org/getpro/habr/upload_files/06c/226/60e/06c22660e83db26852a330a97578663f.png)
- Что вы знаете о сглаживании (MSAA, MLAA, FXAA, TXAA) какие-то еще алгоритмы знаете?
SSAA (Super-Sampling) - Самое тяжелое сглаживание. При четырехкратном (4х) сглаживании видеокарта готовит картинку в разрешении вчетверо выше, чем выводит на экран, потом происходит усреднение цвета соседних пикселей и вывод на экран в исходном разрешении. Получается, что виртуальная плотность пикселей вдвое выше, чем у экрана, и лесенки практически перестают быть заметными. При разрешении: 1920х1080, видеокарта готовит картинку в 4К — 3840х2160. Результат получается идеальным и размытие картинки нет;
MSAA (Multisample anti-aliasing) — улучшенная версия SSAA, но менее затратная. Сглаживание просиходит только по краям геометрии с продолжением по всей длине. В результате нагрузка на видеокарту становится меньше, и по тяжести даже 8 х MSAA оказывается легче 4 х SSAA при сравнимом качестве картинки;
CSAA и CFAA (Coverage Sampling anti-aliasing и Custom-filter anti-aliasing) — улучшенный MSAA, позволяют выбирать дополнительные отсчёты «перекрытия» пикселя, по которым можно уточнять итоговое значение цвета попадающего на край треугольника экранного пикселя. 8x CSAA/CFAA дает сравнимое с 8 x MSAA качество картинки, однако потребляет примерно столько же ресурсов, столько и 4 х MSAA. Размытие картинки – незначительное;
FXAA (Fast approXimate anti-aliasing) — легкое быстрое сглаживание. Здесь совершается один проход по всем пикселям изображения и усредняются цвета соседних согласно определенному шаблону. Это слабо нагружает видеокарту, однако сильно "мылит" картинку, далекие объекты мало узнаваемы. ;
MLAA (MorphoLogical anti-aliasing) — аналог FXAA. Все изображение разбивается на Z, L и U -образные части, и сглаживание происходит смешением цветов пикселей, входящих в каждую такую часть. Единственное сглаживание, работающее полностью на процессоре, поэтому практически не влияет на fps в играх. Изображение получается более качественным, чем с FXAA. Качество картинки – без заметного «замыливания»;
SMAA (Subpixel Morphological anti-aliasing) — смесь FXAA и MLAA - улучшенный MLAA, но работающий на видеокарте. Картинка, сравнимая с MLAA, лучше, чем FXAA, однако потребляет больше ресурсов. Является хорошей заменой FXAA, и по уровню нагрузки на видеокарту находится между отсутствием сглаживания и 2 x MSAA. Картинку практически не блюрит;
TXAA(Temporal antialiasing) — работает с движущимися объектами и хорошо убирает «мельтешение» картинки. Является смесью MSAA и SMAA, дает очень качественную картинку, однако, немного ее мылит блюрит, очень требовательно к ресурсам. Сглаживает очень качественно. Хорошо работает со статикой. Сильно влияет на сглаживание остальных эффектов используемых в сцене;
![Сейчас, во многих играх отдельное внимание уделаяется качеству настроек именно графики, причем очень детально, прописываются отдельные параметры начиная от простых, вроде, отражений и теней и заканчивая алгоритмами сглаживания. Данный подход, в первую очередь, ориентирован на покупателей, чтобы они могли в полной мере насладится продуктом на своей машине, используя те ресурсы, которыми они располагают. Сейчас, во многих играх отдельное внимание уделаяется качеству настроек именно графики, причем очень детально, прописываются отдельные параметры начиная от простых, вроде, отражений и теней и заканчивая алгоритмами сглаживания. Данный подход, в первую очередь, ориентирован на покупателей, чтобы они могли в полной мере насладится продуктом на своей машине, используя те ресурсы, которыми они располагают.](https://habrastorage.org/getpro/habr/upload_files/ae0/27b/3c5/ae027b3c5cccaa90939ac21e3da120a6.png)
- Что такое Paralax Mapping, Тесселяция, Вертикальная синхронизация, Post-processing?
Paralax Mapping - это модифицированная версия известной техники bumpmapping, используемой для придания текстурам рельефности. Parallax mapping не создает 3D-объектов эффект рельефности здесь достигается лишь за счет манипуляций с текстурами.
Вертикальная синхронизация - V-Sync – это синхронизация кадров игры с частотой вертикальной развертки монитора. Здесь полностью просчитанный игровой кадр выводится на экран в момент обновления на нем картинки;
Post processing - Это общее название всех эффектов, которые накладываются на уже готовый кадр полностью просчитанной 3D-сцены для улучшения качества финальной картинки;
Тесселяция - с помощью тесселяции в компьютерной модели повышается количество полигонов в произвольное число раз. Для этого каждый полигон разбивается на несколько новых, которые располагаются приблизительно так же, как и исходная поверхность. Такой способ позволяет легко увеличивать детализацию простых 3D-объектов;
- Что такое отложенный рендеринг?;
Отложенное освещение и затенение, отложенный рендеринг — методика, которая обрабатывает освещение и затенение визуальной сцены. В результате, процесс вычисления разбивается на меньшие части, которые записываются в промежуточную буферную память и объединяются потом. Главным отличием от стандартных методов освещения есть то, что эти методы немедленно записывают результат работы шейдера во фреймбуфер цвета, и так же возможно multiple render targets — MRT, для минимизации трансформации вершин.
Обычно, после построения всех буферов, они считываются из шейдерного алгоритма и объединяются для создания результата. При этом вычислительная сложность и полоса пропускания памяти, необходимые для рендеринга, уменьшаются до видимых частей и уменьшая, тем самым, сложность освещаемой сцены;
- Работали или вы с 2D-3D пакетами (Houdini, Maya, Blender, Nuke, Substance Painter, Photoshop) и что вы в них делали?
Здесь можно показать, ваш домашние/коммерческие проекты/порфолио, обычно его оформляют либо на Artstation, либо на Behance, или на своем личном сайте. Тематика работ может быть самой разной, главное, что хотят увидеть общее качество работ, умение преподносить свою работу, интересно, живо, также оценивается идейная составляющая;
Если человек постоянно копирует, это неплохо, так как он следит за общим трендом индустрии и всегда в курсе всего нового, но так же требуется и реализация новых, именно ваших идей. Цель простая - клиента/конечного игрока надо завлекать интересными образами и нестандартными решениями, его надо "зацепить" и выделить продукт на фоне конкурентов, а их тысячи, уж поверьте;
![Artstation - одна из крупнейших площадок на сегодняшний день по размещению портфелей, как домашних так и коммерческих проектов, есть много разделов, удобная система навигации, магазины, мастерклассы, огромнешее комьюнити практически по всем разделам разработки графики Artstation - одна из крупнейших площадок на сегодняшний день по размещению портфелей, как домашних так и коммерческих проектов, есть много разделов, удобная система навигации, магазины, мастерклассы, огромнешее комьюнити практически по всем разделам разработки графики](https://habrastorage.org/getpro/habr/upload_files/63a/c61/928/63ac61928c6da4d58089e066e3b74ce0.png)
- Что такое текстурный атлас и как его получают, например, для симмуляци дыма в Unity?;
Это изображение, содержащее набор (или «атлас») под-изображений, каждое из которых является текстурой для некоторого 2D или 3D объекта. Под-текстуры отображаются на объект, используя UV-преобразование, при этом координаты в атласе задают, какую часть изображения нужно использовать, либо это представляет собой зацикленые фреймы для какого-либо эффекта, последовательно "засимуленные и отрендеренные" в каком-нибудь графическом пакете, например, Houdini, Maya, 3dsMax, Clarisse и т.д. Это могут быть дымы, огонь, вода, капли, магия и т.д. В качестве рендера выбирают Redshift, Arnold, V-Ray, Mantra. Лучше выбирать GPU рендера, так как всегда необходимо бороться со временем и ускорять процесс разработки;
- Физически-корректный рендеринг что это значит?;
PBR (Physical Based Rendering) - это набор техник визуализации, в основе которых лежит теория, довольно хорошо согласующаяся с реальной теорией распространения света. Поскольку целью PBR является физически достоверная имитация света, он выглядит гораздо более реалистичным по сравнению с моделями освещения Фонга и Блинна-Фонга;
- Что такое BRDF и как он сохраняет энергию?
Чтобы модель освещения могла называться физически-корректной она должна удовлетворять 3-м условиям:
1. Основываться на модели отражающих микрограней;
2. Подчиняться закону сохранения энергии;
3. Использовать двулучевую функцию отражательной способности;
Энергия отраженного света никогда не превышает энергии падающего, в отсутствие дополнительной эмиссии. С увеличением шероховатости поверхности пятно отраженного света увеличивается, но в то же время его яркость снижается. Если бы интенсивность отраженного света была одинаковой для всех пикселей независимо от размера пятна, то более шероховатые поверхности излучали бы гораздо больше энергии, что нарушило бы закон сохранения энергии. Поэтому зеркальные отражения более яркие, на гладких поверхностях и тусклые, на шероховатых.
- В чем одно из преимуществ Vulkan API перед OpenGL?;
Одно из преимуществ - сниженная нагрузка на драйвер, более эффективное использование ЦП, более низкоуровневый подход к железу, может использоваться на любом железе и любой операционной системе. Снижение задержек дает возможность насыщать сцены большим количеством деталей и визуальных эффектов, плавность и динамичность игрового процесса, снижение энергопотребления и количества выделяемого системой тепла ввиду сбалансированной нагрузки на ЦПУ, открытый код позволяет снизить затраты на портирование игр;
![Сравнительный тест Vulkan и OpenGL для AMD Radeon и NVidia Сравнительный тест Vulkan и OpenGL для AMD Radeon и NVidia](https://habrastorage.org/getpro/habr/upload_files/b31/6bd/c74/b316bdc74d9a41a3c10f9c83ddb794a5.png)
- Forward vs Deferred рендеринг в чем разница?;
Forward render - для каждого объекта на экране выставляются сразу параметры, и каждый объект отрисовывается за один раз, но здесь есть сложность ввиду различных материалов с различными шейдерами и видов источника света, чтобы ускорить это процесс предложили Deffered Rendering. Его главная задача состоит в том, чтобы отложить процесс шейдинга/рендеринга на более поздние этапы конвейра.
Deffered rendering проходит в два прохода. В первом мы сохраняем все параметры материалов в массив текстур, который называется GBuffer. Во втором проходе эти параметры декодируются из GBuffer и используются для вычисления освещения. Для Deffered Rendering требуется возможность рендериить сразу в несколько текстур, он использует больше памяти под GBuffer, но он должен быть быстрее за счет вынесения освещения в отдельный проход;
- Какие бывают баги при работе с изображением?;
1. Мерцание, радужная/неоднотонная раскараска геометрии, неккоректный цвет/свет (при эмиссии), двоение/троение геометрии; 2. Некоректная ориентация и отсутствующая геометрия, растягивание геометрии; 3. Некоректная отработка эффектов blur, glow и некоректная работа шейдера в целом и "смазывание" изображения; 4. Неправильный материал - не та текстурная карта/атлас, не то разрешение на карте, отсутствие дополнительных карт (normal/roughness/metalness/emission/diffuse/т.д.); 5. Слишком темный/светлый материал, пересвечивание, отсечка по цвету; 6. Просвечивание объекта, некоректный тайлинг, проблеммы с сихрониацией и задержкой кадра;
- Что лучше использовать трилинейную или билинейную фильтрацию и в чем минусы анизатропоной фильтрации?;
Билинейную предпочтительно использовать, так как она лучше по производительности, анизатропная фильтрация нуждается в повышенной требовательности в ресурсах;
- Статьи по графике и конференции, что вы читали и где были/смотрели?;
Самые распространённые конференции по компьютерной графике: Siggraph, TotalChaos, GTC Nvidia, European Association of Rendering and CG и последние статьи их можно найти на: habr.com, arrXive.org и т.д.;
- Что такое RenderDoc?;
RenderDoc - это бесплатный автономный графический отладчик (профилировщик) с лицензией MIT, который позволяет быстро и легко выполнять однокадровый захват и подробный анализ любого приложения с использованием Vulkan, D3D11, OpenGL, OpenGL ES, D3D12 в Windows 7-10, Linux, Android, Stadia или Nintendo Switch. Есть множество статей с подробным разбором захвата изображения на примере тоже Doom и CyberPunk;
![RenderDoc на проекте dota2 RenderDoc на проекте dota2](https://habrastorage.org/getpro/habr/upload_files/5f6/2d9/ae5/5f62d9ae53ec8ca390bb945b2403d14c.png)
- Чем различаются SSAO, HDR, SSR?;
Screen Space Ambient Occlusion — расчёт фонового освещения в экранном пространстве с учетом нормалей. SSAO является модифицированной версией Ambient Occlusion и тоже имитирует непрямое освещение и затенение. Появление SSAO было обусловлено тем, что при современном уровне быстродействия GPU Ambient Occlusion не мог использоваться для просчета сцен в режиме реального времени.
SSAO выполняется в post process. SSAO работает по упрощенной схеме, но у него есть множество преимуществ: метод не зависит от сложности сцены, не использует оперативную память, может функционировать в динамичных сценах, не требует предварительной обработки кадра и нагружает только графический адаптер, не потребляя ресурсов CPU. SSAO был разработан компанией Crytek для движка CryEngine 2, и впервые был использован в игре Crysis в 2007 году.
HDR - Эффект, часто используемый в игровых сценах с контрастным освещением. Если одна область экрана является очень яркой, а другая, наоборот, затемненной, многие детали в каждой из них теряются, и они выглядят монотонными. HDR добавляет больше градаций в кадр и позволяет детализировать сцену. Для его применения обычно приходится работать с более широким диапазоном оттенков. HDR часто применяется для реализации эффекта приспособления зрения, когда герой в играх выходит из темного туннеля на хорошо освещенную поверхность.
Server-Side Rendering (SSR) Рендерить контент в рантайме на сервере. При таком подходе мы сможем делать запросы backend API и отдавать HTML вместе с необходимым содержимым.
- Опишите графический конвейер?;
1. Vertex/index buffer -> input assembler (собирает сырые данные из вершин буферов, может использоваться индексный буффер, который избавляет от необходимости дублировать данные для повторяющихся элементов) ->
2. Vertex shader (вызывается для каждой вершины и используется для трансформации вершин из локальной системы координат в экранную) ->
3. Tessellation (позволяет увеличить количество мешей за счет дополнительного разбиения геометрии) ->
4. Geometry shader (вызывается для каждого примитива и можно отменить отрисовку или сгенерировать новые примитивы) ->
5. Rasterisation (при этом этапе каждый примитив раскладывается на множество фрагментов, фрагменты - это пиксельные элементы, которые заполняют примитивы во фреймбуфере. Все фрагменты, которые входят за пределы экрана, отсекаются, а атрибуты, переданные вершиным шейдером, интерполируются по фрагментные) ->
6. Fragment shader (вызывается для каждого фрагмента и определяет, в какие фреймбуферы и с каким значением цвета и глубины записываются фрагменты. Для этого он использует интерполированные данные из вершинного шейдера, такие как текстурные координаты и нормали для освещения) ->
7. Color blending (происходит смешивание различных фрагментов, относящихся к одному и тому же пикселю во фреймбуфере. Фрагменты могут перекрывать друг друга или смешиваться в зависимости от прозрачности.) ->
8. Frame buffer;
Могут включаться и дополнительные шаги и подшаги, здесь я привел только общую схему.
Оптимизация
- Какие вы знаете API для работы с GPU?;
Здесь стоит сказать о CUDA SDK (NVidia), Vulkan (MoltenVK), DirectX SDK;
- Можете описать архитектуру работы GPU на примере CUDA?;
Запуск программы на графическом процессоре: 1. Хост выделяет необходимое количество памяти на устройстве; 2. Хост копирует данные из своей памяти в память устройства; 3. Хост запускает ядро на устройстве; 4. Устройство исполняет это ядро; 5. Хост копирует результаты из памяти устройства в свою память.
Центральный процессор взаимодействует с графическим через CUDA Runtime API, CUDA Driver API и CUDA Libraries. Runtime и Driver API отличаются уровнем абстракции. Первый вариант более высокого уровня в плане программирования, более абстрактный, а второй – напротив, более низкого - уровень драйвера;
![Архитектура GPU на примере CUDA Архитектура GPU на примере CUDA](https://habrastorage.org/getpro/habr/upload_files/e8a/c05/4b9/e8ac054b929fa142accc8ef3e79bd647.png)
- Что вы знаете о кэша-памяти L1, L2?;
Кэш-память L1 — самая быстрая память, присутствующая в компьютерной системе, содержит данные, которые ЦПУ, понадобятся при выполнении определенной задачи, обычно занимает до 256 КБ - 2 Мб. Разделяется двумя способами: на кэш команд и кэш данных. Кэш команд имеет дело с информацией об операции, которую должен выполнить ЦП, в то время как кэш данных содержит данные, над которыми должна быть выполнена операция;
Кэш L2 медленнее, чем кэш L1, но больше по размеру. Его размер обычно варьируется от 256 КБ до 8 МБ может быть и больше. Кэш второго уровня содержит данные, которые, вероятно, будут доступны для ЦП в следующий раз;
- В чем разница между концепциями SIMD и Muti-threading, которые встречаются в парадигме параллельного программирования?;
SIMD -"одна инструкция, несколько данных" и является обобщающим термином, описывающим метод, при котором многие элементы загружаются в сверхширокие регистры CPU одновременно, а одна низкоуровневая инструкция (например, ADD, MULTIPLY, AND, XOR) применяется ко всем элементам параллельно;
Многопоточность относится к тому, когда у вас есть несколько потоков выполнения, работающих на разных ядрах CPU, одновременно. Это более высокий уровень, чем SIMD, и обычно потоки существуют намного дольше. Один поток может получать изображения, другой поток может обнаруживать объекты, третий может отслеживать объекты, а последний может отображать результаты.
Особенностью многопоточности является то, что все потоки используют одно адресное пространство, поэтому данные в одном потоке могут быть видны и обработаны другими потоками. Это делает потоки более легкими по сравнению с несколькими процессами, но может затруднить отладку;
Многопроцессорная обработка - здесь каждый процесс имеет свое собственное адресное пространство. Один процесс вряд ли приведет к сбою другого или вмешается в его данные, что несколько облегчает отладку;
- Профилировщик NSight (NVidia) что это?;
Профилировщик NSight - отладчик параллельного кода. Ошибки распараллеливания проблематично отловить из-за недетерминированности поведения параллельных приложений. Более того, если ошибка обнаружена, ее часто сложно воспроизвести снова. Бывает, что после изменения кода, сложно удостовериться, что ошибка устранена, а не замаскирована. Для этих целей и используют NSight;
![Cuda NSight в VisualStudio Cuda NSight в VisualStudio](https://habrastorage.org/getpro/habr/upload_files/db0/90a/dcf/db090adcf1745b79cf2385fb87447258.png)
Математика
- Векторная алгебра: вектора, операции над ними, реализация и представление в коде?;
Векторное и скалярное произведение векторов, сложение, вычитание, умножение. Результатом векторного произведения является вектор, результатом скалярного произведения является скаляр (число). Сложение множества векторов. Здесь можно почитать курс по высшей математике для вузов под редакцией, например, Письменного Д. или Кострикина;
- Матрицы и операции с ними (матрицы трансформации (сдвиг, поворот, скейл), сложение, вычитание, умножение?;
Работа с матрицами трансформации для сдвига, поворота, скейла (Матрицы элементами которых являются тригонометрические функции). Единичная матрица - матрица, у которой на главной диагонали стоят нули; нулевая матрица - матрица, элементами которой являются нули; сумма/разность двух матриц - это матрица с тем же количеством строк и столбцов как у исходных матриц, действия производятся поэлементно; умножение двух матриц - осуществимо если число столбцов одной матрицы равно числу строк другой матрицы;
- Варианты представления углов в графике?;
Углы Эйлера – углы, описывающие поворот абсолютно твердого тела в трёхмерном евклидовом пространстве;
Кватернионы - система гиперкомплексных чисел, образующая векторное пространство размерностью 4 над полем вещественных чисел. Кватернионы удобны для описания изометрий трёх- и четырёхмерного евклидовых пространств. Кватернион можно представить через мнимые единицы, как вектор и скаляр, через комплексные числа, через матричные представления;
Системы контроля версий
- Что такое система контроля версий и какие вы знаете?;
Система контроля версий - это система записывающая изменения в файл или набор файлов в течении времени и позволяющая вернуться позже к определенной версии. Системы контроля версия бывают локальные (+ хорошо решает поставленную перед ней задачу, быстро работает, но не предназначена для коллективного использования), распределенные - клиенты получают репозиторий целиком (Git, Mercurial, Bazaar, Darcs), централизованные (возможна коллективная работа с файлами, легкость в управлении, - наличие SPOF - SVN, CVS, Perforce). Git работает через SHA-1 хеш, сохраняет объект не по имени, а по его содержимому;
- Какие клиенты/GUI для работы с системой контроля версий вы использовали/знаете?;
Наиболее распространненные SourceTree, GitKraken, могут бытьи другие, но их не очень много;
- Что за комманды mergе, rebase, fetche, pull, push?;
$git fetch <remote-name> забирает те данные проекта, которых у нас еще нет;
$git fetch <remote-name> не сливает полученные ветки с нашими наработками;
$git pull получает изменения из удаленной ветки и сливает их со своей текущей;
$git push <remote-name><brach-name> отправляет ветку в удаленный репозиторий;
$git merge - позволяет слить две ветки при совместной разработке;
$git rebase - механизм перебазирования ветки
Merge - оставляет историю более точной, но более грязной; Rebase - оставляет историю менее точной, но более чистой, кроме того, подвержен проблема при изменении расшаренных комитов. Rebase хорош, для локальной подчистки истории, для расшаренных комитов лучше применять merge;
- Есть ли у вас опыт разрешения конфликтов на ветках и что это такое?;
Слияния очень важны для поддержания кода в актуальном состоянии позволяет вносить в репозиторий прежде всего локальный все новые изменения, сделанные другими участниками проекта. Даже при анализе истории слияния ветвей, бывает очень трудно понять, какие же изменения были сделаны для разрешения конфликта. Отмена неудачного слияния может стать проблеммой. Большая часть конфликтов слияния происходит при работе с чужим кодом. Да опыт есть на примере при помощи Source Tree и его инструментов;
![Система контроля версий на базе GUI Source Tree Система контроля версий на базе GUI Source Tree](https://habrastorage.org/getpro/habr/upload_files/517/974/7c8/5179747c858a9cff4d1fbe9d716cbae8.png)
Конечно данные вопросы могут быть расширены дополнительными, здесь же я постарался освятить только основные моменты.