• Оптимизация рендера под Mobile. Часть 3. Шейдеры

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


      В мобильной экосистеме оптимальный код — всегда хорошо. Ведь даже в случае достижения требуемой частоты формирования кадров более оптимальный код позволяет переводить CPU и GPU на пониженные частоты, за счет чего снижается расход заряда и увеличивается среднее время сессий. Это, в свою очередь, положительно сказывается на доходе от игр со встроенной монетизацией.
      Читать дальше →
      • +18
      • 3,1k
      • 5
    • Суперсовременный OpenGL. Часть 1



        Всем привет. Все кто хоть немного разбирался в теме OpenGL знают, что существует большое количество статей и курсов по этой теме, но многие не затрагивают современный API, а часть из них вообще рассказывают про glBegin и glEnd. Я постараюсь охватить некоторые нюансы нового API начиная с 4-й версии. Ссылка на вторую часть статьи
        Читать дальше →
      • Создание шейдера травы в движке Unity

        • Перевод

        Из этого туториала вы научитесь писать геометрический шейдер для генерации травинок из вершин входящего меша и использовать тесселяцию для управления плотностью травы.

        Статья описывает поэтапный процесс написания шейдера травы в Unity. Шейдер получает входящий меш, и из каждой вершины меша генерирует при помощи геометрического шейдера травинку. Ради интереса и реализма травинки будут иметь рандомизированные размеры и поворот, а ещё на них будет влиять ветер. Чтобы управлять плотностью травы, мы используем тесселяцию для разделения входящего меша. Трава сможет и отбрасывать, и получать тени.

        Готовый проект выложен в конце статьи. В созданном файле шейдера содержится большое количество комментариев, упрощающих понимание.
        Читать дальше →
        • +47
        • 15,3k
        • 4
      • Unity: бесконечный процедурно генерируемый город, получаемый при помощи алгоритма WFC (коллапс волновой функции)

        • Перевод
        Привет, Хабр!

        Как законодатели мод по теме Unity на российском рынке предлагаем вам почитать интересное исследование о практическом использовании алгоритма WFC (Wave Function Collapse), построенного по образу и подобию известного принципа квантовой механики и очень удобного при процедурной генерации уровней в играх. Ранее на Хабре уже публиковался подробный рассказ об этом алгоритме. Автор сегодняшней статьи Мариан Кляйнеберг рассматривает алгоритм в контексте трехмерной графики и генерации бесконечного города. Приятного чтения!

        Читать дальше →
      • Режимы смешивания в Unity

        Многие наверняка слышали о режимах смешивания (blend modes), которые присутствуют в большинстве популярных программ для работы с изображениями и видео. Там это — важный инструмент создания контента, давно уже ставший неотъемлемой их частью.

        А что же в играх?

        Допустим, появилась необходимость использовать Color Dodge смешивание для системы частиц или UI-художник сделал красивую графику для игрового интерфейса, но некоторые его элементы используют какой-нибудь Soft Light. А может, вам понадобилось подвергнуть трёхмерный объект Divide-смешиванию, чтобы получить эффект прямиком из кинокартин Линча?



        В данной статье мы рассмотрим принцип работы популярных режимов смешивания и постараемся максимально точно воссоздать их эффект на игровом движке Unity.
        Читать дальше →
      • Трассировка лучей на GPU в Unity

        • Перевод
        Для трассировки лучей (ray tracing) настали удивительные времена. Компания NVIDIA реализует ускоренное с помощью ИИ шумоподавление, Microsoft объявляет о нативной поддержке в DirectX 12, а Питер Ширли продаёт свои книги по свободной цене (pay what you want). Похоже, что трассировка лучей наконец получила шанс быть принятой при дворе. Возможно, говорить о начале революции ещё слишком рано, но уже определённо стоит начать изучать и накапливать знания в этой области.

        В этой статье мы напишем с нуля в Unity очень простой трассировщик лучей с помощью compute shaders. Скрипты мы будем писать на C#, а шейдеры — на HLSL. Весь код выложен на Bitbucket.

        В результате у нас получится отрендерить нечто подобное:

        Читать дальше →
        • +38
        • 15,2k
        • 6
      • Четвертый уровень мульти-вселенной Макса Тегмарка

          Почти 10 лет назад я прочитал статью Макса Тегмарка, гениального физика и философа, и нашел в ней ответы на многие вопросы, которые мучали меня всю жизнь. Статья потрясающая, месяца два я ходил под впечатлением от нее. К сожалению, это лонгрид, к тому же на английском. Поэтому я решил даже не перевести ее – перевод все равно оказался бы слишком длинным для Хабр, но хотя бы изложить основную идею в том порядке, как мне это кажется логичным, и убрав излишние детали (да простит меня Макс!)

          Читать дальше →
        • Unity: процедурное редактирование Mesh

            Преобразование моделей «на лету» — нередкая практика в симуляции физики деформаций, а также в играх с динамически генерируемым и изменяемым контентом. В таких случаях удобно применять методы процедурного редактирования и создания геометрии. Последние часто позволяют сэкономить заветные байты при передаче подгружаемых из сети данных. Кроме того — это весело!

            Статья направлена на прокачку навыков процедурной обработки мешей в Unity. Мы расскажем об операциях преобразования и генерации частей меша.

            Читать дальше →
            • +18
            • 7,3k
            • 9
          • Ускоряем неускоряемое или знакомимся с SIMD

              Есть класс задач, которые нельзя ускорить за счёт оптимизации алгоритмов, а ускорить надо. В этой практически тупиковой ситуации к нам на помощь приходят разработчики процессоров, которые сделали команды, позволяющие выполнять операции на большим количеством данных за одну операцию. В случае x86 процессоров это инструкции сделанные в расширениях MMX, SSE, SSE2, SSE3, SSE4, SSE4.1, SSE4.2, AVX, AVX2, AVX512.

              В качестве «подопытного кролика» я взял следующую задачу:
              Есть неупорядоченный массив arr с числами типа uint16_t. Необходимо найти количество вхождений числа v в массив arr.
              Классическое решение, работающее за линейное время выглядит так:

              int64_t cnt = 0;
              for (int i = 0; i < ARR_SIZE; ++i)
                  if (arr[i] == v)
                      ++cnt;
              

              В таком виде бенчмарк показывает следующие результаты:

              ------------------------------------------------------------
              Benchmark                     Time           CPU Iterations
              ------------------------------------------------------------
              BM_Count                   2084 ns       2084 ns     333079
              

              Под катом я покажу как его ускорить в 5+ раз.
              Читать дальше →
            • Профилируем Unity проект с Android Studio

              Всем день добрый! Это статья о том, как профайлить Unity игры на Android с Android Studio. Я расскажу о том, как настроить Android Studio и получить максимальное кол-во данных. Вопросы анализа и выводов на основе полученного результата находятся вне рамок данной статьи.
              Читать дальше →
            • Математика в Gamedev по-простому. Триангуляции и Triangle.Net в Unity

                Всем привет! Меня зовут Гриша, и я основатель CGDevs. Математика – очень крутой инструмент при разработке игр. Но если скажем без понимания векторов и матриц обойтись в принципе сложно, то алгоритмы триангуляций не столь обязательная вещь, но с помощью них решается достаточно большое количество интересных задач. Сегодня хотелось бы поговорить про достаточно важный инструмент в вычислительной геометрии, такой как триангуляции и их применение в игровой индустрии. Кроме того, я написал порт и немного обёрток великолепной библиотеки Triangle.Net для Unity. Если интересно – добро пожаловать под кат. Ссылка на гитхаб прилагается.


                Читать дальше →
                • +26
                • 11k
                • 6
              • Карты из шестиугольников в Unity: сохранение и загрузка, текстуры, расстояния

                • Перевод
                Части 1-3: сетка, цвета и высоты ячеек

                Части 4-7: неровности, реки и дороги

                Части 8-11: вода, объекты рельефа и крепостные стены

                Части 12-15: сохранение и загрузка, текстуры, расстояния

                Части 16-19: поиск пути, отряды игрока, анимации

                Части 20-23: туман войны, исследование карты, процедурная генерация

                Части 24-27: круговорот воды, эрозия, биомы, цилиндрическая карта

                Часть 12: сохранение и загрузка


                • Отслеживаем тип рельефа вместо цвета.
                • Создаём файл.
                • Записываем данные в файл, а затем считываем его.
                • Сериализуем данные ячеек.
                • Уменьшаем размер файла.

                Мы уже умеем создавать достаточно интересные карты. Теперь нужно научиться их сохранять.

                Читать дальше →
              • Рендеринг воды в экранном пространстве

                • Перевод
                image

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

                Мне не очень нравится подход с voxelized / marching cubes при рендеринге воды (см. например, рендеринг симуляции жидкости в Blender). Когда объём воды находится в том же масштабе, что и используемая для рендеринга сетка, движение получается заметно дискретным. Эту проблему можно решить, увеличив разрешение сетки, но для тонких струй на относительно длинные расстояния в реальном времени это просто непрактично, потому что сильно влияет на время выполнения и занимаемую память. (Есть прецедент использования разреженных воксельных структур, улучшающий ситуацию. Но я не уверен, насколько хорошо это работает для динамических систем. Кроме того, это это не тот уровень сложности, с которым я бы хотел работать.)

                Первой альтернативой, которую я исследовал, были меши экранного пространства Мюллера (Müller’s Screen Space Meshes). В них используется рендеринг частиц воды в буфер глубин, его сглаживание, распознавание соединённых фрагментов похожей глубины и построение из результата меша с помощью marching squares. Сегодня этот способ, вероятно, уже стал более применимым, чем в 2007 году (поскольку теперь мы можем создавать меш в compute-шейдере), но он всё равно связан с бОльшим уровнем сложности и затрат, чем бы мне хотелось.

                В конце концов я нашёл презентацию Саймона Грина с GDC 2010 «Screen Space Fluid Rendering For Games». Она начинается точно так же, как и Screen Space Meshes: с рендеринга частиц в буфер глубин и его сглаживания. Но вместо построения меша получившийся буфер используется для затенения и композитинга жидкости в основной сцене (с помощью записи глубины явным образом.) Именно такую систему я и решил реализовать.
                Читать дальше →
                • +26
                • 7,4k
                • 4