Как сделать сглаживание в юнити

Обновлено: 06.07.2024

Производительность игры может очень важна, так как она позволяет охватывать множество платформ, в том числе низкопроизводительные. Jonathan Gonzalez делится секретам из собственного опыта, как сделать игру без багов и с нормальным fps.

Чаще всего довольно индивидуальный процесс, но есть общие пункты, на которые стоит обратить внимание.

Чем проще, тем лучше

Когда вы разрабатываете игру, вам нужно конкретно обозначить, что вам нужно включать и что не нужно.
Jonathan возвращается к старым скриптам или проектам и найти способы сделать что-то продуктивнее и проще.
Если же вы делаете игру впервые, всё равно помните об этом пункте, но не слишком ограничивайте себя.

Используйте Profiler

Прежде чем вы начнете удалять строки кода, очищать ненужные файлы и пытаться сделать все, что вам нужно, необходимо знать, что на самом деле вызывает проблемы с производительностью.
Profiler – отличный способ получить подробный обзор того, как ваша игра работает. Ищите его тут: Window>Profiler.

Во время игры вы должны держать это окно видимым. Он будет отображать такие категории нагрузку на CPU и GPU, рендеринг, физику, аудио и другое.

Правильно задавайте тип объекта

Уменьшение разрешения и повторное использование текстур.

Множество текстур с высоким разрешением замедлят производительность. Текстуры нужно использовать правильно и по возможности объединять несколько объектов в одну большую текстуру.
Это обычная практика в AAA-играх. Таким образом вы можете уменьшить количество используемых текстурных карт, и упростить организацию. Например, игра Rage and Doom, с использованием Megatextures и виртуального текстурирования.

Используйте ограничение в рендере.

Мы можем сказать Unity не визуализировать объекты, которые скрыты. Это позволяет нам только визуализировать объекты, на которые у нас есть прямая видимость. Нет причин для рендеринга объекта в дальнем конце обзора нашей камеры, если мы не сможем увидеть его напрямую.
Для этого вы можете использовать Frustum Culling, Occlusion Culling и SECTR VIS.

Оптимизируйте видимые объекты.

LODs (Levels Of Detail) – способ рендеринга low poly сетки, когда она находится за пределами определенного расстояния.
MipMaps – это аналог LODs для текстур. Чем дальше текстура от камеры, тем меньше в нём разрешения.

Используйте правильные параметры сжатия и загрузки для аудио.


Unity поддерживает несколько типов аудио, по умолчанию он будет импортировать аудиоклипы для использования типа загрузки Decompress On Load вместе со сжатием Vorbis.

Для одного зацикливающегося аудиоклипа импортируемый размер составляет 3,3 МБ, что значительно увеличивает память, необходимую для нашей игры. Исходный размер – это количество ram, которое потребуется для воспроизведения этого клипа.
Звуковые эффекты обычно короткие и, следовательно, имеют небольшие требования к памяти. Для них настройка Decompress on Load будет работать лучше всего, но тип сжатия должен быть либо PCM, либо ADPCM. PCM обеспечивает более высокое качество, но поставляется с большим размером файла, что отлично подходит для очень короткого, но важного звукового эффекта. ADPCM имеет коэффициент сжатия в 3,5 раза меньше, чем PCM, и лучше всего используется для аудиоэффектов, которые используются очень часто, таких как шаги, удары, оружие и т. Д.
Для более длинных аудиоклипов, таких как фоновая музыка или другие большие файлы, лучше использовать сжатым в памяти, что приводит к распаковке файла прямо перед воспроизведением. Потоковая передача (streaming) – еще один вариант. Согласно документам Unity, потоковая передача использует минимальный объем памяти для хранения сжатых данных, которые затем постепенно считываются с диска.

Оптимизация физических вычислений.


В Unity вы можете использовать несколько разных коллайдеров, такие как box colliders, capsule colliders, mesh colliders, и различные 2D colliders. По возможности используйте примитивные коллайдеры. Это ваши основные формы для коллайдеров, такие как коробка, сфера или капсула.
Mesh Colliders принимают форму какой-либо сетки, которую вы указываете. Примером этого может служить человеческий персонаж с коллайдером, который соответствует их форме. Его следует избегать, если это возможно. Если без этого никак, создайте низкополигональную версию сетки и назначьте Mesh Colliders.

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

Привет всем.
Настало время разобраться с MSAA в Unity;) Ситуация такая, сперва я грешил на себя, думал, что я как-то влияю на MSAA с помощью своего пост-эффекта. Теперь пришел к тому, что взял обычную камеру, включил MSAA и он не работает в Forward, Deffered и других render path кроме LegacyVertexLit.
В QualitySettings AntiAliasing выставил в 8x MultiSampling.
1) Ставлю на камере RenderPath: Forward и получаю такие ступени:

Screen Shot 2017-06-05 at 21.37.51 | Unity3D, не работает MSAA

Теперь в В QualitySettings AntiAliasing выставил в Disabled и ступени появляются сзади:

2017-06-05_21-41-10 | Unity3D, не работает MSAA

В общем, как ни кручу эти настройки не могу убрать все ступени.
Теперь ставлю render path = LegacyVertexLit + QualitySettings AntiAliasing выставил = 8x MultiSampling, ступеней нет:

2017-06-05_21-45-10 | Unity3D, не работает MSAA

Правда картинка стала какой-то тусклой. Почему MSAA может не работать в режиме Forward и Deffered?

Это из-за скринспэйс теней. Сначала сцена рисуется с MSAA, потом резолвится, и уже резолвнутый буффер глубины, без антиальясинга используется для расчёта теней. Зачем так сделали мне совершенно непонятно.

Что делать - писать свои тени.

Мда, приехали. Я все хотел изучить то как работают тени, настало время :)
Battle Angel Alita
Можете статью подкинуть, которая позволит разобраться с тем как сделать кастомную тень/решить эту проблему ?

В сторе есть ассет The Blacksmith: Unique Character Shadows. Там всё понятно написано.

Я подозреваю что проблема в последовательности. MSAA в юнити это пост эффект, а тень в свою очередь отрисовывается не в свою очередь (такой вот каламбур), то есть после пост эффекта. Из за этого тень получается квадратной без MSAA. Если приглядеться к первой картинке то там видно как из под тени рядом с гранью, выглядывает задний фон который бы не вылез без MSAA. Попробуй найти где у них там Queue.

Помимо того, что MSAA с тенями не дружит, так еще получилось так, что мой постэффект все же не способствует сглаживанию.
В чем проблема: есть пост-эффект, который работает благодаря нескольким камерам:
1) Камера 1 снимает окружающую обстановку + пишет данные окружающей обстановки в буффер глубины (скрипт для наглядности):

2) Камера 2 снимает персонажа и пишет его данные в буффер глубины.
3) Спец. скрипт берет данные с 2-х камер (цвет+глубина) и подает их в шейдер, затем результат обработки выводится на экран, получется как-то так:

В результате эффект работает как нужно, но вообще без всякого MSAA. Глупый вопрос, почему нет MSAA? Он же аппаратный, разве нет?
Пробовал на разных компах, MSAA нигде нет.

foxes
попробую поискать Queue, спасибо, но вопрос, что выше, пока в силе.

1. Ты сам создаёшь рендертаргет без антиальясинга, а потом жалуешься.
2. Если таргеты скомбайнить по глубине, то вылезет та-же хрень что и выше с тенями.
3. Ничего с этим не поделаешь т.к. в юньку не завезли поддержку sampler2DMS.

Battle Angel Alita
> 1. Ты сам создаёшь рендертаргет без антиальясинга, а потом жалуешься.
Спасибо Вам, сам бы я долго тыкался, это частично решило мои проблемы:
outputRenderTexture.antiAliasing = QualitySettings.antiAliasing;
outputDepthTexture.antiAliasing = QualitySettings.antiAliasing;

Alerr
> Глупый вопрос, почему нет MSAA? Он же аппаратный, разве нет?
Я немного перепутал, MSAA и FSAA.
Раньше был старый добрый AA который работал строго аппаратно и настраивался при создании окна. Но все остальное это очень хитро сделано в полу ручном режиме, короче программно все реализуется с поддержкой драйверов. Поскольку сейчас программно можно практически залезть в видеокарту.

И еще эта проблема в Unity3d c тенями с 2013 года стоит у них в багтреккере так они ее не починили.

Заметил, что самое главное-то не получилось сделать: соединить MSAA + мой постэффект, чтобы постобработанная картинка была сглаженной.
После того как я включил сглаживание для текстур:

Вот здесь перестали подаваться текстуры глубины (они содержат нули, не то что содержали до включения сглаживания одной из текстуры), текстуры цветов передаются нормально:

Принимаю текстуры так:

В чем может быть проблема? Почему активация *depthTexture.antiAliasing = QualitySettings.antiAliasing; изменяет текстуру глубины?

Безуспешно пробовал обойтись без MSAA: пробовал сглаживать текстуру с камеры шейдерами, MSAA дает все же более хороший результат.
Вот здесь, при установке значений MSAA хотябы для одной из текстур, камера не выдает значения буффера глубины:

Кто-нибудь пробовал брать значения глубины с 2-х камер для проведения постобработки с использованием MSAA.
Может есть другие варианты передать 2-а буффера глубины + 2-е RGB-текстуры с 2-х камер в шейдер?

Самое главное что вы должны знать о графике — это то, из чего она состоит.

Графика строится из набора изображений, который смешивается друг с другом по определенному закону, который приближает визуализацию финального изображения к реальному (либо стилизованному, если так задумано). Так устроен любой рендерер(и корона и вирей и редшифт и октан и все все все) и движок Unity работает точно по такому же принципу. Если кратко, то берем базовые цвета поверхностей, перемножаем их с освещенностью, добавляем отражения и спекуляр. Это общеизвестные факты, но без них никуда, любой 3дшник должен это знать и использовать!

Казалось бы всё просто, сел и сделал красиво, но в реальности мало кто может добиться приличных результатов за короткий срок, всё потому что в юнити до сих пор нет некоторых очень важных элементов, которые позволяют это сделать быстро и главное надёжно.

В 2019 году мы имеем стандартные тени такого вида

Справа из ассетстора за деньги, называется NGSS. Речь идет о Реалтаймовых тенях, а не о запеченных.

Объемный свет

Нативного решения у юнити вообще нет, поэтому сравнивать не буду. Просто покажу, что есть несколько вариантов решений в ассетсторе на примере своей игры:

Есть бесплатный вариант AURA, есть платные решения. AURA мне по нескольким причинам не понравилась, в первую очередь из-за своей стабильности, поэтому я пользуюсь платным ассетом: HxVolumetricLighting.

Постобработка

У юнити есть есть PostProcessStackV2 и он в целом справляется со своей задачей, но кое чего всё равно не хватает, это хорошего AO, точнее HBAO+. Это ScreenSpace Ambient Occlusion, который не создает теней на объектах разнесенных по глубине.

Кроме самозатенения тут есть и очень интересная возможность Color Bleeding — эмуляция вторичного отражения света, которое добавляет картинке жизни, в простонародье - вторичка(от Древнегреческого Secondary GI).

Шейдеры

Ну и в конце концов не стандартными материалами едиными живём, шейдеры тоже нужно делать уникальные и для этого совсем не обязательно писать код, потому что есть Amplify Shader Editor, нодовый редактор, который может освоить любой 3дмаксер, майер, блендераст и прочие синемешники. :) без обид, блендер клёвый!

В частности можно сделать вот такой вот шейдер стекла из картинки выше, а на картинке ниже то, как он выглядит в редакторе:

Как вы могли заметить, это мало чем отличается от стандартных материал эдиторов популярных 3д пакетов, и на самом деле переход с них на редактор шейдеров в юнити очень прост, достаточно просто изучить список доступных нод, а принцип всего остально тот же самый. Но вы не представляете насколько классно после часов страданий ожиданий в 3дмаксике результатов настройки материала - видеть всё в режиме реального времени да ещё и вращать всё на одном месте камерой.

Для кого-то это покажется несущественным, но для меня наличие данных возможностей — единственное, что позволяет вообще делать графику на юнити, а не там где вы возможно подумали, потому что главное в Юнити это всё таки удобство и стоимость разработки с малым числом людей и бюджетом, а для нас — инди — это самое главное. Как известно: дьявол кроется в деталях и я перечислил те из них, которые считаю самыми важными. Всё остальное это уже стандартный подход: замоделить модельки, затекстурить модельки, сделать шейдер и т. п. По данной теме итак предостаточно информации.

PS: Покатились астедава! :)))

Интересно! Спасибо! Подскажи, пожалуйста, а почему не UE? Предполагаю, что из-за расходной составляющей. Или нет? Тогда интересно узнать Твоё мнение. Заранее благодарен за ответ!

Геймплей явно страдает, это мне стало ясно из видео. Да и цена для пазла дороговато. Но графика вполне.

Руслан Латыпов Интересно! Спасибо! Подскажи, пожалуйста, а почему не UE? Предполагаю, что из-за расходной составляющей. Или нет? Тогда интересно узнать Твоё мнение. Заранее благодарен за ответ!

Сергей Патюк Геймплей явно страдает, это мне стало ясно из видео. Да и цена для пазла дороговато. Но графика вполне.


это был тестовый проект по принципе сможем или нет сделать игру, но как обычно он затянулся, со дня на день более геймплейный проект затизерим.


Temporal anti-aliasing (also known as TAA) is a anti-aliasing technique to reduce temporal aliasing (flickering or shimmering effects). This technique can be combined with FXAA for better quality. Временное сглаживание (также известное как TAA ) - это метод сглаживания, позволяющий уменьшить алиасинг (эффекты дрожания или мерцания). Этот метод можно комбинировать с FXAA для лучшего качества.


ISS without TAA. ISS без TAA.


ISS with TAA. ISS с TAA.


Unlike Multisample anti-aliasing (MSAA) that performs anti-aliasing only on edges of polygons (and makes this edges smoother), Temporal anti-aliasing applies smoothing to the whole scene. In case of full deferred rendering (when the final image is composed of different texture buffers: depth, normal, etc.), MSAA will increase performance costs, because Multisample anti-aliasing should be applied to each texture buffer. В отличие от Multisample anti-aliasing (MSAA), который выполняет сглаживание только на краях многоугольников (и делает эти края более гладкими), Temporal Anti-aliasing применяет сглаживание ко всей сцене. В случае полного отложенного рендеринга (когда конечное изображение состоит из различных буферов текстуры: глубины, нормалей и т.д.) MSAA увеличит снижение производительности, потому что к каждому буферу текстуры будет применяться сглаживание Multisample.


The main concept of temporal anti-aliasing is to use a subpixel jitter of scene camera every frame and then combine all this frames into the final image. So, it will take time to get a smoothed picture (for example, 5-7 frames), but with the frequency of 60 frames per second it will look seamlessly. Основная концепция временного сглаживания заключается в использовании субпиксельного дрожания камеры сцены в каждом кадре, а затем объединении всех этих кадров в окончательное изображение. Так что для получения сглаженного изображения потребуется время (например, 5-7 кадров), но с частотой 60 кадров в секунду оно будет выглядеть безупречно.



Simplified demonstration of the TAA camera jitter. Упрощенная демонстрация дрожания камеры TAA.


During rasterization process, there is a test whether the object will get into pixel or not. And the object will not be rendered if it doesn't occupy a major part of a pixel. В процессе растеризации происходит проверка, попадет ли объект в пиксель или нет. И объект не будет отображаться, если он не занимает большую часть пикселя.



Vector image before rasterization. Векторное изображение до растеризации.


And here we can get an error, when we have a sphere object before rasterization and get a square object after, because some parts of the sphere doesn't occupy enough pixel space. И здесь мы можем получить ошибку, когда у нас есть объект сферы до растеризации и получается квадратный объект после, потому что некоторые части сферы не занимают достаточно места в пикселях.



Bitmap image after rasterization without TAA. Растровое изображение после растеризации без TAA.


Not a very good rendering, right? And temporal anti-aliasing solves this problem, because camera will have a subpixel jitter, and each part of this sphere at least once will be rendered in a frame. And after combining these frames, we will get a true sphere, not a square! Voila! Не очень хороший рендеринг, правда? А временное сглаживание решает эту проблему, потому что камера будет иметь субпиксельный джиттер, и каждая часть этой сферы хотя бы один раз будет визуализирована в кадре. И после объединения этих кадров мы получим настоящую сферу, а не квадрат! Вуаля!



Bitmap image after rasterization with TAA. Растровое изображение после растеризации с помощью TAA.


TAA has a wide scope of usage, because it improves whole image (not only the edges of the geometry, like MSAA) including geometry, shadows, etc. It greatly reduces all the problems, and does not cut the performance down, working well with both static and dynamic images. However, keep in mind that the key factor of good TAA performance is optimized content of the scene: the higher FPS is, the faster temporal anti-aliasing smooths the scene. In addition to this, UNIGINE allows you to choose the type of anti-aliasing: TAA or FXAA, or combine them both for better image quality (FXAA is applied before temporal summing). TAA имеет широкую сферу применения, так как улучшает все изображение (не только края геометрии, как MSAA), включая геометрию, тени и т. д. Это значительно снижает все проблемы и не снижает производительность, хорошо работает как со статическими, так и с динамическими изображениями. Однако имейте в виду, что ключевым фактором хорошей производительности TAA является оптимизированный контент сцены: чем выше FPS, тем быстрее TAA сглаживает сцену. В дополнение к этому, UNIGINE позволяет вам выбрать тип сглаживания: TAA или FXAA , или объединить их оба для лучшего качества изображения. (FXAA применяется перед временным суммированием).


Temporal Anti-Aliasing (TAA) settings are available for adjustment via the Render -> Antialiasing section of the Settings window, along with SRAA, Fast approXimate Anti-Aliasing (FXAA) and Supersampling settings. The following settings are available when the Custom preset for Anti-Aliasing is selected. Параматры временного сглаживания (TAA) доступны для настройки в разделе Render -> Antialiasing окна Settings наряду с настройками Fast ApproXimate Anti-Aliasing (FXAA) и Supersampling .

TAA Settings


Anti-Aliasing Settings Настройки сглаживания

TAA Включает и выключает TAA.
Fix Flicker Удаляет яркие пиксели, используя информацию о яркости пикселей из предыдущего кадра. Мы рекомендуем включать эту опцию для ярких тонких веревок, проводов и лески. Однако при включении могут возникать артефакты из-за удаления небольших ярких объектов.


Может управляться консольной командой render_taa_fix_flicker .


Может управляться с помощью render_taa_frames_by_color консольной команды.


Может управляться консольной командой render_taa_catmull_resampling .




Может управляться консольной командой render_taa_antialiasing_in_motion .




Может управляться консольной командой render_taa_preserve_details .

  • Это значение используется только тогда, когда параметр Frames By Velocity ниже отключен.
  • Может управляться консольной командой render_taa_frame_count .


Может управляться консольной командой render_taa_pixel_offset .


Может управляться консольной командой render_taa_samples .


Кадры по скорости


Может управляться с помощью render_taa_frames_by_velocity консольной команды.


Может управляться консольной командой render_taa_frames_velocity_threshold .


Может управляться консольной командой render_taa_max_frames_by_velocity .


Может управляться консольной командой render_taa_min_frames_by_velocity .


As you can see TAA has a lot of settings enabling you to adjust it for relatively static scenes as well as for dynamically changing environments. Как видите, TAA имеет множество настроек, позволяющих настраивать его как для относительно статичных сцен, так и для динамически меняющейся среды.


Below is an example of TAA settings for relatively static scenes. Ниже приведен пример настроек TAA для относительно статичных сцен.

TAA Settings for Relatively Static Scenes


Recommended Antialiasing Settings for Relatively Static Scenes Рекомендуемые настройки сглаживания для относительно статических сцен

  • The Diagonal Neighbors option should be enabled, as it provides more accurate pixel color information reducing the stair-step effect. At the same time TAA causes more blurring is case of fast camera movement, which is especially noticeable on grass and other similar high-contrast screen areas. Параметр Diagonal Neighbors должен быть включен, поскольку он обеспечивает более точную информацию о цвете пикселей, уменьшая эффект ступенчатости. В то же время TAA вызывает большее размытие при быстром движении камеры, что особенно заметно на траве и других подобных высококонтрастных областях экрана.
  • Preserve Detail value is decreased to reduce flickering of small pixels. Значение Preserve Detail уменьшено, чтобы уменьшить мерцание мелких пикселей.
  • The number of TAA Samples is set to 16 , which increases the number of variants for subpixel camera jittering, thus making the stair-step effect even less noticeable. Для количества выборок TAA установлено значение 16 , что увеличивает количество вариантов субпиксельного дрожания камеры, делая, таким образом, ступенчатый эффект еще менее заметным.


Below is an example of TAA settings for very dynamic scenes where trails from thin objects are especially noticeable. Ниже приведен пример настроек TAA для очень динамичных сцен, где особенно заметны следы от тонких объектов.

TAA Settings for Dynamic Scenes


Recommended Antialiasing Settings for Dynamic Scenes Рекомендуемые настройки сглаживания для динамических сцен

  • The Diagonal Neighbors option should be turned off, as it may result in significant blurring of small details in motion. Опцию Diagonal Neighbors следует отключить, так как это может привести к значительному размытию мелких деталей в движении.
  • Increase the Preserve Details value up to 1 or higher to reduce ghosting effect for moving objects. Увеличьте значение Preserve Details до 1 или выше, чтобы уменьшить эффект ореола для движущихся объектов.
  • Set TAA Samples value to 4 to reduce flickering of small pixels when the camera does not move. Установите значение TAA Samples на 4 , чтобы уменьшить мерцание мелких пикселей, когда камера не двигается.
  • It is also recommended to reduce Max Frame Count to 60 or lower, to accumulate less frames for slow motion, reducing the ghosting effect. Также рекомендуется уменьшить Max Frame Count до 60 или ниже, чтобы накапливать меньше кадров для замедленного движения и уменьшить эффект двоения.

Читайте также: