Soft particles что это
Мягкие частицы (Soft Particles).
Одной из хорошо распиаренных возможностей DX10 являются так называемые мягкие частицы (soft particles). Однако на самом деле для реализации этого эффекта вполне достаточно поддержки SM3 и и они великолепно делаются на OpenGL (не требуя при этом мелкомягкой и убогой ви$ты).
Рассмотрим что же именно подразумевается под «мягкими» частицами и в чем заключается их отличие от традиционных частиц.
Рис 1. Артефакты, возникающие при использовании традиционных частиц.
Это связано с тем, что частицы представлена одним полигоном, в то время как частицы обычно соответствуют не плоским фигурам, а объемными.
Рис 2. Сцена с рис. 1, но с использованием мягких частиц.
Рис 3. Отличие мягкой частицы от обычной.
В идеальном случае при выводе такой частицы нам необходимо определить длину части луча (соответствующего текущему фрагменту), целиком лежащей внутри видимой части объема частицы.
При этом возможны два случая.
1. Луч «протыкает» объемную частицу насквозь и просто берем прозрачность из текстуры (рис 4.a).
2. Внутри шара находятся непрозрачные объекты, выведенные ранее. Тогда нам нужен отрезок от точки входа в частицу до ближайшего пересечения луча с объектами сцен, лежащими внутри объемной частицы. В этом случае отношение длины этого отрезка к заданной толщине частицы задает увеличение прозрачности частицы (рис 4.b).
Таким образом, в тем местах, где billboad уходит за объекты сцены происходит плавное «пропадание» частицы (вместо резкого скачка).
Для того, чтобы можно было понять протыкает ли луч насквозь такую объемную частицу или нет, нам достаточно прочесть значение из z-буфера, соответствующее данному фрагменту, и сравнить его с текущей глубиной частицы с учетом заранее заданной толщины частицы.
Поскольку полупрозрачные объекты, в том числе и частицы, всегда выводят после вывода непрозрачных, то можно после вывода всех непрозрачных объектов скопировать буфер глубины в текстуру и при выводе мягких частиц читать из нее значения глубины.
Это удобно еще и потому, что во многих случаях для повышения быстродействия сначала осуществляется рендеринг всей сцены только в буфер глубины (подобный прием был использован Дж. Кармаком еще в Doom III).
Ниже приводится соответствующий фрагментный шейдер и скриншот, полученный при его использовании.
Ниже приводится полный исходный код на С++, использованный для рендеринга сцены с рис. 2 и 5.
По этой ссылке можно скачать весь исходный код к этой статье. Также доступны для скачивания откомпилированные версии для M$ Windows и Linux.
Copyright © Alexey V. Boreskov 2003-2008
Quality
Unity allows you to set the level of graphical quality it attempts to render. Generally speaking, quality comes at the expense of framerate and so it may be best not to aim for the highest quality on mobile devices or older hardware since it tends to have a detrimental effect on gameplay. Use the Quality settings (menu: Edit > Project Settings, then select the Quality category) to select the quality level in the Editor for the chosen device. It is split into two main areas: the Quality matrix appears at the top; and below it, the settings for the selected quality level appear.
Unity lets you assign a name to a given combination of quality options for easy reference. The rows of the matrix let you choose which of the different platforms each quality level applies to. The Default row at the bottom of the matrix is not a quality level in itself but rather sets the default quality level used for each platform (a green checkbox in a column denotes the level currently chosen for that platform). Unity comes with six quality levels pre-enabled but you can add your own levels.
Quality settings levels for each platform
To delete an unwanted quality level, use the trashcan icon (the rightmost column).
To select a quality level for editing, click on its name in the matrix. Its definitions appear in the panel below the settings and you can modify any settings you need to:
Edit the settings for a specific Quality level
To define a new Quality level, click the Add Quality Level button and type the name for the new level in the Name property box.
Then you can choose which of the quality options documented in the following sections you need to update or set:
Rendering
If you disable this property, Unity only calculates Texture Streaming for GameObjects with Streaming Controller components. Use this for finer-grained control of Texture Streaming. See documentation on Texture Streaming API: Control Cameras for Texture Streaming for more details.
Streaming textures pick the smallest mipmap level possible to try to hit the memory budget. Unity always loads non-streaming textures at full resolution, even if that exceeds the budget.
The Memory Budget includes non-streaming Textures. For example, if your budget is 100MB and you have 90MB of non-streaming Textures, The Texture Streaming system tries to fit all the streaming Textures in the remaining 10MB. If it can’t, it loads the mipmaps at a lower resolution.
Unity prioritises the Max Level Reduction over the Memory Budget. The Texture Streaming system never discards more mipmaps than the Max Level Reduction, even if the lack of reduction causes the memory to exceed the Texture Streaming Memory Budget.
The Texture Streaming system never discards more mipmaps than this value, even if the lack of reduction causes the memory to exceed the Texture Streaming Memory Budget.
This value is also the mipmap level that the Texture Streaming system initially loads at startup. For example, when this is set to 2, Unity skips the two highest mipmaps on first load.
If the Scene Texture content changes significantly and rapidly, the system might attempt to load more Texture mipmaps than the file IO can keep up with. Lowering this value reduces the IO bandwidth that the Texture Streaming system generates. The result is a more rapid response to changing mipmap requirements.
Anti-aliasing
Anti aliasing improves the appearance of polygon edges, so they are not “jagged”, but smoothed out on the screen. However, it incurs a performance cost for the graphics card and uses more video memory (there’s no cost on the CPU though). The level of anti-aliasing determines how smooth polygon edges are (and how much video memory it consumes).
Without anti-aliasing, polygon edges are “jagged”. With 4x anti-aliasing, polygon edges are smoothed out.
Hardware anti-aliasing does not work with Deferred Shading A rendering path in the Built-in Render Pipeline that places no limit on the number of Lights that can affect a GameObject. All Lights are evaluated per-pixel, which means that they all interact correctly with normal maps and so on. Additionally, all Lights can have cookies and shadows. More info
See in Glossary or HDR high dynamic range
See in Glossary rendering. For more information on anti-aliasing compatibility, see Post processing.
Soft Particles
Soft particles fade out near intersections with other Scene geometry. This looks much nicer, but is more resource intensive to process and only works on platforms that support depth textures. Furthermore, you have to use either the Deferred Shading or Legacy Deferred Lighting rendering path, or make the camera render depth textures from scripts.
Shadows
Property: | Function: | |
---|---|---|
Shadowmask Mode | Choose the shadowmask behavior when using the Shadowmask Mixed lighting mode. Use the Lighting window (menu: Window > Rendering The process of drawing graphics to the screen (or to a render texture). By default, the main camera in Unity renders its view to the screen. More info See in Glossary > Lighting) to set this up in your Scene. | |
Distance Shadowmask A version of the Shadowmask lighting mode that includes high quality shadows cast from static GameObjects onto dynamic GameObjects. More info See in Glossary | Unity uses real-time shadows up to the Shadow Distance, and baked shadows beyond it. | |
Shadowmask A Texture that shares the same UV layout and resolution with its corresponding lightmap. More info See in Glossary | Static GameObjects The fundamental object in Unity scenes, which can represent characters, props, scenery, cameras, waypoints, and more. A GameObject’s functionality is defined by the Components attached to it. More info See in Glossary that cast shadows always cast baked shadows. | |
Shadows A UI component that adds a simple outline effect to graphic components such as Text or Image. It must be on the same GameObject as the graphic component. More info See in Glossary | Choose which type of shadows to use. The available options are Hard and Soft Shadows, Hard Shadows Only and Disable Shadows. | |
Shadow Resolution | Choose which resolution to render shadows at. The available options are Low Resolution, Medium Resolution, High Resolution and Very High Resolution. The higher the resolution, the greater the processing overhead. | |
Shadow Projection | Choose which method to use for projecting shadows from a directional light. | |
Close Fit | Renders higher resolution shadows but they can sometimes wobble slightly if the camera moves. | |
Stable Fit | Renders lower resolution shadows but they don’t wobble with camera movements. | |
Shadow Distance | Enter the maximum distance from the Camera at which shadows are visible. Unity does not render shadows that fall beyond this distance. | |
Shadow Near Plane Offset | Enter the offset shadow near plane to account for large triangles being distorted by shadow pancaking. | |
Shadow Cascades | Choose the number of shadow cascades to use. The available options are No Cascades, Two Cascades, or Four Cascades. A higher number of cascades gives better quality but at the expense of processing overhead (see Shadow Cascades for further details). | |
Cascade splits | Adjust the cascade shadow split(s) by moving the vertical line between each cascade left or right. Depending on what value you chose for the Shadow Cascades setting, you can see two or four different colors. If Shadow Cascades is set to No Cascades, then this entire control is hidden. |
Other
Property | Function |
---|---|
Blend Weights | Choose the number of bones that can affect a given vertex during an animation. The available options are 1 Bone, 2 Bones, 4 Bones, and Unlimited. |
V Sync Count | Choose to synchronize rendering with vertical blanks or not to synchronize at all. Unity can synchronize rendering with the refresh rate of the display device to avoid tearing artifacts. The available options are Every V Blank, Every Second V Blank, or Don’t Sync. |
Lod Bias | Set the level-of-detail (LOD) bias. LOD levels are chosen based on the onscreen size of an object. When the size is between two LOD levels, the choice can be biased toward the less detailed or more detailed of the two Models available. This is set as a fraction from 0 to +infinity. When it is set between 0 and 1 it favors less detail. A setting of more than 1 favors greater detail. For example, setting LOD Bias to 2 and having it change at 50% distance, LOD actually only changes on 25%. |
Maximum LOD The Level Of Detail (LOD) technique is an optimization that reduces the number of triangles that Unity has to render for a GameObject when its distance from the Camera increases. More info See in Glossary Level | Set the highest LOD that the game uses. See Maximum LOD level for more information. |
Particle Raycast Budget | Set the maximum number of raycasts to use for approximate particle system A component that simulates fluid entities such as liquids, clouds and flames by generating and animating large numbers of small 2D images in the scene. More info See in Glossary collisions A collision occurs when the physics engine detects that the colliders of two GameObjects make contact or overlap, when at least one has a Rigidbody component and is in motion. More info See in Glossary (those with Medium or Low quality). See Particle System Collision Module. |
Async Upload Time Slice | Set the amount of CPU time in milliseconds per frame Unity spends uploading buffered Texture and Mesh The main graphics primitive of Unity. Meshes make up a large part of your 3D worlds. Unity supports triangulated or Quadrangulated polygon meshes. Nurbs, Nurms, Subdiv surfaces must be converted to polygons. More info See in Glossary data to the GPU. See LoadingTextureandMeshData. |
Async Upload Buffer Size | Set the size in megabytes of the Async Upload Buffer Unity uses to stream Texture and Mesh data for the to the GPU. See LoadingTextureandMeshData. |
Maximum LOD level
Unity does not use Models which have a LOD below the MaximumLOD level and omits them from the build (which saves storage and memory space). Unity uses the smallest LOD value from all the MaximumLOD values linked with the Quality settings for the target platform. If an LOD level is included, then Models from that LODGroup are included in the build and always loaded at runtime for that LODGroup, regardless of the Quality setting being used. As an example, if LOD level 0 is used in any Quality setting then all the LOD levels are included in the build and all the referenced Models load at runtime.
Tearing
The picture on the display device is not continuously updated, but rather the updates happen at regular intervals much like frame updates in Unity. However, Unity’s updates are not necessarily synchronized with those of the display, so it is possible for Unity to issue a new frame while the display is still rendering the previous one. This results in a visual artifact called “tearing” at the position onscreen where the frame change occurs.
Simulated example of tearing. The shift in the picture is clearly visible in the magnified portion.
It is possible to get Unity to switch frames only during the period where the display device is not updating, the so-called “vertical blank”. The V Sync Count option in Quality settings synchronizes frame switches with the device’s vertical blank or optionally with every other vertical blank. The latter may be useful if the game requires more than one device update to complete the rendering of a frame.
2017–09–18 Page amended
Shadowmask Mode added in 2017.1 NewIn20171
Частицы в Unity3d
Итак, урок посвящен частицам в Unity3d. Предназначен скорее для новичков, но каждый, думаю, найдет что-то для себя интересное. Движок сегодня очень популярен и не осваивает его только ленивый. К тому же проект, над которым я сейчас работаю мы делаем тоже на Юнити.
ОГОНЬ
Теперь в свитке Inspector в сабсвитке Particle System появились настройки нашей системы частиц. В принципе можно настраивать и отсюда их. Но удобнее будет нажать кнопку «Open Editor…». Откроется окно со всеми эмитерами и их настройками. Очень удобно, если настраивается сложный эффект. Визуально все понятно и не возникает путаницы. Справа вверху у Вас будет несколько вспомогательных кнопок Show Selected, Resimulate, Wireframe. Show Selected чуть затемняет все не выбранные эмитеры и подсвечивает тот, который Вы выбрали в данный момент.
рис. 002 Выбирать эмитеры(после того, как Вы их создали, конечно) можно в свитке Hierarchy.
Первое, что мы должны сделать, чтобы увидеть не дефолтные белые шарики, а нужную текстуру – это сделать материал и текстуру огня. Сразу оговорюсь, что делать текстуры то еще развлечение. Достаточно долгая и кропотливая работа. Но как я уже говорил – это стоит того в итоге. Я использую свои давние наработки, которые я делал для игры Deep Black. Для текстур огня и дыма я использовал FumeFX плагин для 3dsmax. Моделировал различные взрывы, интенсивность, направления и т.д. Потом рендерил в серии кадров. Так я получал различной интенсивности и размера огненные всполохи. С дымом чуть проще. Как? Расскажу позже.
Итак, чтобы создать новый материал достаточно кликнуть правой кнопкой по любому месту в папке Materials (для моего проекта)
Возвращаемся в наш редактор частиц, выбираем эмитер FireMetalBarrel и сразу же переходим в самый нижний сабсвиток Renderer. Ставим галочку (это значит, что он не будет игнорироваться и будет активен ) и разворачиваем его кликом по нему. Render Mode оставляем Billboard. Это значит, что при любом угле обзора текстуры частиц всегда будут направлены в камеру. Снимаем галочки Cast и Receive Shadows так как шейдер материалов, типа Particles не принимает тени и не отбрасывает их. Перетаскиваем наш заготовленный материал в строчку Material и видим что-то отдаленно похожее на огонь. Материал можно так же назначить выбрав его из всех доступных, нажав маленький кружок обведенный зеленым цветом.
Опишу действие параметров:
Duration – общая продолжительность эффекта. Как показала практика особо не влияет при зацикленных эффектах.
Looping – зацикленность
Prewarm – как бы прогрев эффекта, чтобы он начался уже с основной интенсивностью
Start Delay – задержка в старте проигрывания в секундах
Start Lifetime – Время жизни в секундах
Start Speed – скорость, с которой стартуют частицы
Start Rotation – стартовая повернутость частицы на определенный градус. В нашем случае от 0 до 360.
Start Color – стартовый цвет. Можно регулировать по альфе или по цвету.
Gravity Multiplier – множитель гравитации. 9,82 м/c– гравитация для планеты Земля.
Inherit Velocity – наследуемая скорость для следующих частиц.
Simulation Space – система координат. В нашем случае – world. При Local позволяет частицам перемещаться вместе с эмитером, как например, двигатель космолета. При world – частицы ведут себя, как факел, который несут, т.е. отстают от эмитера.
Play on Awake – частицы стартуют автоматически.
Max Particles – максимальное кол-во частиц одновременно проигрываемых из этого эмитера.
Emission
Rate – количество частиц генерируемое в секунду.
Bursts – Параметр, который позволяет выбрасывать сразу нужное кол-во частиц в указанные промежутки времени, а не одна за другой последовательно. Выключен, в нашем случае.
Shape
Shape – форма эмитера. Конус, сфера, полусфера, бокс, меш.
Angle – угол разброса. В нашем случае 15 градусов.
Radius – радиус эмитера.
Emit from – откуда генерируются частицы. Из одной точки, из всего тела эмитера и т.д.
Random Direction – Задает случайное направление движения частиц. Помогает создать некую мелкую хаотичность в нашем случае с генерацией языков пламени.
Velocity over Lifetime
Параметр позволяет рандомайзить скорость движения частиц в течение их жизни. В нашем случае система координат world и направление вверх, т.е. по Y. Случайная скорость от 0.5 до 1. Получается, что языки пламени движутся с разной скоростью.
Force over Lifetime
Система координат тоже world. Помогает задать влияние небольших сил, которые смещают частицы в стороны по Х и по Y на небольшие расстояния. Y в данном случае почему то работает, не вверх, как в предыдущем.
Color over lifetime
Очень важный параметр, который помогает сделать плавным визуальное появление частицы по альфе и плавным ее пропаданием.
рис. 007 Тут можно регулировать цвета и альфаканал.
Rotation over Lifetime
Если Вы все сделали правильно, то у Вас должно получиться довольно неплохое пламя. Но, сам эффект еще не готов и на половину и поэтому не стоит расстраиваться, если огонь далек от идеала. Сейчас я расскажу о том, как сделать дым. По сути с ним все просто – это тот же самый огонь лишь клонированный и немного перенастроенный
После небольшой обработки по размерам и десатурейту (превратил в ч/б) и добавления альфа канала путем копирования самого изображения и вставки в канал альфа – имеем нечто похожее на текстуру дыма.
Кстати я рекомендую стараться делать все текстуры кратные степени двойки по сторонам, типа 128х128, 1024х512, 64х16 и т.д. Это сэкономит Вам уйму времени, если надумаете использовать их потом еще в других проектах.
Создаём новый материал Smoke и настраиваем его по образу и подобию материала огня с той разницей, что используем немного другой шейдер и другую текстуру.
Вводим параметры, как показано на рисунке 008.
ИСКРЫ.
Искры, по сути, тот же клонированный огонь с измененными параметрами и другим материалом. Назовем этот эмитер Spark. Настройки для него показаны на рис. 012.
Текстуру можете сделать в Фотошопе – это маленькая точка или точка с небольшим свечением вокруг. Размер текстуры, как я уже говорил в начале 16х16 или около того. Шейдер – Particles/Additive.
ГОРЯЧИЙ ВОЗДУХ.
Здесь опять тот же хорошо настроенный, клонированный и чуть модифицированный эмитер огня, но все дело делает шейдер, который по дефолту не идет с Юнити. У нас он был написан нашими программистами для проекта. Думаю не составит труда найти подобный шейдер в инете.
Ну и финальный результат смотрите на видео: