Делаю игру на Unity3d. Эпизод 8: Compute shaders
Здравствуйте, дорогие Пикабушники и Пикабушницы!
Сегодня поговорим о вычислительных шейдерах.
Вычислительные шейдеры (Compute Shaders) — это специальные программы, которые исполняются на графическом процессоре (GPU) и предназначены для выполнения произвольных вычислений, не связанных напрямую с отрисовкой кадров. В отличие от традиционных шейдеров (вершинных, фрагментных, геометрических), вычислительные шейдеры запускаются отдельно от графического конвейера (pipeline) и обеспечивают выполнение мощных параллельных вычислений.
Основное преимущество вычислительных шейдеров связано с тем, что GPU обладает огромным количеством вычислительных ядер, способных выполнять параллельные задачи намного быстрее, чем CPU.
Для чего нужны вычислительные шейдеры?
Они применяются в различных задачах, где требуется высокая производительность и возможность распараллеливания. Рассмотрим основные сферы применения:
1. Компьютерная графика:
Генерация текстур: Например, процедурное создание текстур (в реальном времени).
Симуляция частиц и физические эффекты: Просчёт поведения частиц, разрушений, тканевой физики и других эффектов.
Обработка освещения: Такие техники, как глобальное освещение или расчёт шейдинга, могут выполняться с использованием вычислительных шейдеров.
Обработка данных для рендеринга:
Сортировка объектов.
Быстрые фильтрации (например, Gaussian Blur, эффекты пост-обработки).
2. Физические симуляции:
GPU способен рассчитывать реалистичное поведение объектов:
Симуляция жидкостей (например, с помощью решателей уравнений Навье-Стокса).
Сжатия объектов (метод конечных элементов).
Расчёт мягких тел (soft body physics).
3. Машинное обучение и нейросети:
Вычислительные шейдеры могут обрабатывать данные для обучения нейронных сетей и выполнения ускоренных операций (например, свёртки в CNN).
4. Обработка больших массивов данных:
Выполнение сортировки данных (например, алгоритм Radix Sort).
Построение физико-математических симуляций — от сложных систем частиц до устойчивой к деформациям геометрии.
Обработка 2D/3D массивов: Волновые симуляции, обработка многомерных точек данных.
5. Симуляция природных явлений:
Вода, дым, снег — GPU выполняет симуляцию частиц для достижения реалистичного эффекта.
Облачные эффекты (например, расчет шейдерного шума для облаков).
6. Процедурная генерация:
Используются для генерации 3D-объектов, ландшафтов, текстур и анимаций. Например:
Gelände (ландшафт).
Бесшовные шумовые текстуры (Perlin Noise, Simplex Noise).
Ну а я покажу, как вычислительные шейдеры можно использовать в игре
А потом приглашаю в комментарии - задавайте вопросы по видео и просто по юнити!
Приятного просмотра!
Моя борьба с Шейдерами на Unity Shader Graph
Всем примет, меня зовут Даниил и я разработчик мобильной игры Неко Скольжение. Путь разработки даже такой небольшой игры для одного программиста наполнен трудностями и сегодня я хочу рассказать вам как я с шейдерами боролся.
Для тех, кто не знает, шейдеры – это небольшие программы для графического процессора, с инструкциями, как отрисовывать тот или иной объект. Сам я с шейдерами раньше не работал и писать для них код стоило бы мне множества усилий. Поэтому, Юнитевский Shader Graph стал для меня спасением. Правда и здесь, мне кажется, я мог сделать лучше.
Взглянем на граф шейдера обычного кота.
Для него пришлось писать мега-шейдер, который сразу бы позволил:
— Добавить засветку текстуры определённым цветом;
— Добавить эффект растворения текстуре;
— Позволить произвести заливку текстуры конкретным цветом с анимацией относительно конкретной точки.
Когда кота засасывает чёрная дыра, он должен сначала полностью стать белым, и только потом улететь в дыру. Один объект белого цвета, который бы расширялся и обрезался маской на котах, было бы тяжело правильно реализовать, учитывая, что маски на момент решения задачи уже использовались в другом месте. Да и делать маску под каждое состояние кота казалось трудозатратной задачей для небольшой механики.
Самой сложной задачей, в данном случае, оказалась задача определения точки, с которой текстура бы заливалась цветом. Путём кучи математических операций удалось достичь, чтобы на спрайтах разного размера и в разном положении, наложение цвета происходило бы с одинаковой точки и одинакового размера.
Однако, без проблем не обошлось. В шейдере можно заметить внешние параметры Bounds Min и Bounds Max. Те, кто работал с Shader Graph, знают, что в нём есть отдельная нода объекта, в которой уже хранятся эти параметры, так зачем же я их передаю? А ответ простой – батчинг. Как оказалось, когда Юнити пакует несколько спрайтов с одним шейдером на отрисовку, у них становятся общие границы, из-за чего точка заливки цветом сдвигается, и приходится выдумывать вот такие велосипеды, чтобы всё починить.
Ещё одним испытанием для меня стало написание шейдера эффекта искажения пространства от чёрной дыры. Очевидно, что мне необходимо было брать отрендеренное изображение при первом проходе и вносить искажения в него. Однако уже на этом этапе возникли некоторые сложности, так как мало того, что искажение изображения за материалом для 2D и 3D шейджеров работает по-разному, так ещё и в Юнити существуют _CameraOpaqueTexture и _CameraSortingLayerTexture, и первоначально мне попадались гайды с первой, поэтому мне долго пришлось разбираться с настройкой.
Но эффект того стоил, выглядит он довольно неплохо для человека, который имеет небольшой опыт работы с графом.


Котиков как будто засасывает внутрь чёрной дыры.
Хотя, даже с законченной текстурой есть проблемы. В одной из минорных версий Юнити, они в очередной раз сломали Vulkan API, из-за чего пара пользователей пожаловалась на чёрный экран при запуске, а в Firebase приходил краш. Я решил, что можно выключить Vulkan API, и собрать версию так. Но после этого, почему-то, сломалось определение позиции для применения эффекта.
Возможно, что-то в матрице преобразования не работает или ещё какие-то проблемы, но эффект стал работать неправильно. Я попытался разобраться в конкретных причинах, но пока что не смог понять, что не так и как заставить его работать правильно, поэтому просто поднял минорную версию Юнити до самой актуальной (мне всё равно нужно было это сделать для асинхронного инстатиирования объектов), и решил последить, будут ли ещё жалобы на чёрный экран.
На данный момент, это были два моих самых проблемных шейдера, но если вам интересны какие-либо ещё аспекты разработки игры или предложения по поводу правильного составления графа шейдеров – я всегда буду рад прочитать.
Раздача ассета для постобработки Toon Detailer: Cavity & Contours на asset store unity
UPD:
Правильная ссылка : ЗАБРАТЬ К сожалению поздно заметил ошибку.
Toon Detailer: Cavity & Contours
Код : INABSTUDIO
Улучшите внешний вид своей игры с помощью «Toon Detailer». Сделайте края яркими, покажите вмятины и подчеркните изгибы. Идеально подходит для оживления низко полигональной, мультяшной или стилизованной эстетики.
Описание
Присоединяйтесь к Discord для получения обновлений, чтобы сообщить о проблемах или просто поздороваться!
Перед покупкой ознакомьтесь с документацией.
Особенности:
Простота использования: просто прикрепите «Toon Detailer» к камере или конвейеру рендеринга и начните настраивать параметры.
Затухание глубины: позвольте эффекту постепенно затухать на удаленных объектах, гарантируя, что все будет выглядеть гладко во всех сценариях.
Маскирование: используйте маски, чтобы легко применить эффект к определенным областям или объектам в вашей сцене или исключить некоторые из них.
Несколько свойств: настройте различные контуры, полости и другие параметры, чтобы добиться желаемого вида.
Совместимость:
Поддерживает URP и встроенные версии 2021.3 и выше.
Поддержка Unity 6! (см. ограничения ниже)
Для работы демонстрационных сцен требуется встроенный Shader Graph.
Ограничения:
В Unity 6 (URP) отложенный рендеринг поддерживается не полностью. (пока!) Подробнее см. в документации.
Не поддерживает VR, webGL
Код : INABSTUDIO






