Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Экземпляры GPU обеспечивают значительный прирост производительности по сравнению с CPU рендерингомпроцессом вывода графики на экран (или текстура). По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
См. в Словарь
. Вы можете использовать его, если хотите создать свою систему частицКомпонент, который имитирует текучие объекты, такие как жидкости, облака и пламя, путем создания и анимации большое количество небольших 2D-изображений в сцене. Подробнее
См. в Словарь
для отображения MeshОсновной графический примитив Unity. Меши составляют большую часть ваших 3D-миров. Unity поддерживает триангулированные или четырехугольные полигональные сетки. Поверхности Nurbs, Nurms, Subdiv должны быть преобразованы в полигоны. Подробнее
Посмотреть в частицах Словарь
(в отличие от < по умолчанию режим рендерингаСтандартный параметр материала шейдера, который позволяет выбрать, использует ли объект прозрачность, и если да, то какую. тип используемого режима наложения. Подробнее
См. в Словарь
рендеринга рекламный щитТекстурированный 2D-объект, который вращается таким образом, что всегда обращен к камере. Подробнее
См. в частицах Словарь
).

Чтобы иметь возможность использовать экземпляр GPU с вашими системами частиц:

  • Установите для модуля визуализации системы частиц значение Mesh.

  • Используйте шейдерПрограмму, работающую на графическом процессоре. Подробнее
    См. Словарь
    для рендерера материал, поддерживающий создание экземпляров GPU

  • Запустите свой проект на платформе, поддерживающей создание экземпляров GPU

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

Возможность включения экземпляра графического процессора Particle System в модуле Renderer.
Возможность включения экземпляра графического процессора Particle System в модуле Renderer.

Unity поставляется со встроенным шейдером частиц, который поддерживает создание экземпляров графического процессора, но материал частиц по умолчанию не использует его, поэтому вы должны изменить это, чтобы использовать экземпляр графического процессора. Шейдер частиц, который поддерживает создание экземпляров графического процессора, называется Particles/Standard Surface. Чтобы использовать его, вы должны создать свой собственный новый материалактив, который определяет, как должна отображаться поверхность. Подробнее
См. в Словарь
и установите шейдер материала на Particles/Standard Поверхность. Затем вы должны назначить этот новый материал полю материала в модуле Particle System рендерера.

Встроенный шейдер, совместимый с Particle System GPU Instancing.
Встроенный шейдер, совместимый с Particle System GPU Instancing.

Если вы используете другой шейдер для своих частиц, он должен использовать «#pragma target 4.5» или выше. Дополнительные сведения см. в разделе Цели компиляции шейдера. Это требование выше, чем обычное использование экземпляров графического процессора в Unity, поскольку система частиц записывает все данные своего экземпляра в один большой буфер, а не разбивает создание экземпляров на несколько вызовов отрисовки.

Примеры пользовательских шейдеров

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

Инстанс графического процессора системы частиц в поверхностном шейдере

Вот полный рабочий пример Surface Shader с использованием Particle System Instancing:

Shader "Instanced/ParticleMeshesSurface" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Glossiness ("Smoothness", Range(0,1)) = 0.5 _Metallic ("Metallic", Range(0,1)) = 0.0 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM // Physically based Standard lighting model, and enable shadows on all light types // And generate the shadow pass with instancing support #pragma surface surf Standard nolightmap nometa noforwardadd keepalpha fullforwardshadows addshadow vertex:vert // Enable instancing for this shader #pragma multi_compile_instancing #pragma instancing_options procedural:vertInstancingSetup #pragma exclude_renderers gles #include "UnityStandardParticleInstancing.cginc" sampler2D _MainTex; struct Input { float2 uv_MainTex; fixed4 vertexColor; }; fixed4 _Color; half _Glossiness; half _Metallic; void vert (inout appdata_full v, out Input o) { UNITY_INITIALIZE_OUTPUT(Input, o); vertInstancingColor(o.vertexColor); vertInstancingUVs(v.texcoord, o.uv_MainTex); } void surf (Input IN, inout SurfaceOutputStandard o) { // Albedo comes from a texture tinted by color fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * IN.vertexColor * _Color; o.Albedo = c.rgb; // Metallic and smoothness come from slider variables o.Metallic = _Metallic; o.Smoothness = _Glossiness; o.Alpha = c.a; } ENDCG } FallBack "Diffuse" }

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

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

#pragma instancing_options procedural:vertInstancingSetup #include "UnityStandardParticleInstancing.cginc"

The other modification in the example is to the Vertex function, which has two extra lines that apply per-instance attributes, specifically, particle colors and Texture Sheet Animation texture coordinates:

vertInstancingColor(o.vertexColor); vertInstancingUVs(v.texcoord, o.uv_MainTex);

Инстанс графического процессора Particle System в пользовательском шейдере

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

Shader "Instanced/ParticleMeshesCustom" { Properties { _MainTex("Albedo", 2D) = "white" {} [Toggle(_TSANIM_BLENDING)] _TSAnimBlending("Texture Sheet Animation Blending", Int) = 0 } SubShader { Tags{ "RenderType" = "Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile __ _TSANIM_BLENDING #pragma multi_compile_instancing #pragma instancing_options procedural:vertInstancingSetup #include "UnityCG.cginc" #include "UnityStandardParticleInstancing.cginc" struct appdata { float4 vertex : POSITION; fixed4 color : COLOR; float2 texcoord : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct v2f { float4 vertex : SV_POSITION; fixed4 color : COLOR; float2 texcoord : TEXCOORD0; #ifdef _TSANIM_BLENDING float3 texcoord2AndBlend : TEXCOORD1; #endif }; sampler2D _MainTex; float4 _MainTex_ST; fixed4 readTexture(sampler2D tex, v2f IN) { fixed4 color = tex2D(tex, IN.texcoord); #ifdef _TSANIM_BLENDING fixed4 color2 = tex2D(tex, IN.texcoord2AndBlend.xy); color = lerp(color, color2, IN.texcoord2AndBlend.z); #endif return color; } v2f vert(appdata v) { v2f o; UNITY_SETUP_INSTANCE_ID(v); o.color = v.color; o.texcoord = v.texcoord; vertInstancingColor(o.color); #ifdef _TSANIM_BLENDING vertInstancingUVs(v.texcoord, o.texcoord, o.texcoord2AndBlend); #else vertInstancingUVs(v.texcoord, o.texcoord); #endif o.vertex = UnityObjectToClipPos(v.vertex); return o; } fixed4 frag(v2f i) : SV_Target { half4 albedo = readTexture(_MainTex, i); return i.color * albedo; } ENDCG } } }

Этот пример содержит тот же код настройки, что и поверхностный шейдер для загрузки данных о положении:

#pragma instancing_options procedural:vertInstancingSetup #include "UnityStandardParticleInstancing.cginc"

Модификация вершинной функции также очень похожа на поверхностный шейдер:

vertInstancingColor(o.color); #ifdef _TSANIM_BLENDING vertInstancingUVs(v.texcoord, o.texcoord, o.texcoord2AndBlend); #else vertInstancingUVs(v.texcoord, o.texcoord); #endif

Единственное различие здесь по сравнению с первым примером выше заключается в смешивании анимации листа текстуры. Это означает, что шейдеру требуется дополнительный набор координат текстуры для чтения двух кадров анимации листа текстуры вместо одного и их смешивания.

Наконец, фрагментный шейдер считывает текстуры и вычисляет окончательный цвет.

Инстанс графического процессора системы частиц с пользовательскими потоками вершин

В приведенных выше примерах используются только настройки потока вершин по умолчанию для частиц. Это включает в себя положение, нормаль, цвет и один UV. Однако, используя пользовательские потоки вершин, вы можете отправлять в шейдер другие данные, такие как скорости, повороты и размеры.

В следующем примере шейдер предназначен для отображения специального эффекта, благодаря которому более быстрые частицы выглядят ярче, а более медленные — тусклее. Есть дополнительный код, который делает частицы ярче в зависимости от их скорости, используя Speed Vertex Stream. Кроме того, поскольку этот шейдер предполагает, что эффект не будет использовать анимацию листа текстуры, он исключен из пользовательской структуры потока.

Вот полный шейдер:

Shader "Instanced/ParticleMeshesCustomStreams" { Properties { _MainTex("Albedo", 2D) = "white" {} } SubShader { Tags{ "RenderType" = "Opaque" } LOD 100 Pass { CGPROGRAM #pragma exclude_renderers gles #pragma vertex vert #pragma fragment frag #pragma multi_compile_instancing #pragma instancing_options procedural:vertInstancingSetup #define UNITY_PARTICLE_INSTANCE_DATA MyParticleInstanceData #define UNITY_PARTICLE_INSTANCE_DATA_NO_ANIM_FRAME struct MyParticleInstanceData { float3x4 transform; uint color; float speed; }; #include "UnityCG.cginc" #include "UnityStandardParticleInstancing.cginc" struct appdata { float4 vertex : POSITION; fixed4 color : COLOR; float2 texcoord : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct v2f { float4 vertex : SV_POSITION; fixed4 color : COLOR; float2 texcoord : TEXCOORD0; }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert(appdata v) { v2f o; UNITY_SETUP_INSTANCE_ID(v); o.color = v.color; o.texcoord = v.texcoord; vertInstancingColor(o.color); vertInstancingUVs(v.texcoord, o.texcoord); #if defined(UNITY_PARTICLE_INSTANCING_ENABLED) UNITY_PARTICLE_INSTANCE_DATA data = unity_ParticleInstanceData[unity_InstanceID]; o.color.rgb += data.speed; #endif o.vertex = UnityObjectToClipPos(v.vertex); return o; } fixed4 frag(v2f i) : SV_Target { half4 albedo = tex2D(_MainTex, i.texcoord); return i.color * albedo; } ENDCG } } }

Шейдер включает UnityStandardParticleInstancing.cginc, который содержит макет данных создания экземпляров по умолчанию, когда пользовательские потоки вершин не используются. Таким образом, при использовании пользовательских потоков вы должны переопределить некоторые значения по умолчанию, определенные в этом заголовке. Эти переопределения должны располагаться перед включением. В приведенном выше примере устанавливаются следующие пользовательские переопределения:

Во-первых, есть строка, которая указывает Unity использовать пользовательскую структуру MyParticleInstanceData для данных пользовательского потока с помощью макроса UNITY_PARTICLE_INSTANCE_DATA:

#define UNITY_PARTICLE_INSTANCE_DATA MyParticleInstanceData

Next, another define tells the instancing system that the Anim Frame Stream is not required in this shader, because the effect in this example is not intended for use with texture sheet animation:

#define UNITY_PARTICLE_INSTANCE_DATA_NO_ANIM_FRAME

В-третьих, объявляется структура данных пользовательского потока:

struct MyParticleInstanceData { float3x4 transform; uint color; float speed; };

Все эти переопределения появляются до включения UnityStandardParticleInstancing.cginc, поэтому шейдер не использует собственные значения по умолчанию для этих определений.

При написании структуры переменные должны соответствовать потокам вершин, перечисленным в Инспектореокне Unity, в котором отображается информация о текущий выбранный игровой объект, актив или настройки проекта, что позволяет вам просматривать и редактировать значения. Дополнительная информация
См. в Словарь
в модуле визуализации системы частиц. Это означает, что вы должны выбрать потоки, которые хотите использовать в модуле визуализации. UI(пользовательский интерфейс) Позволяет пользователю взаимодействовать с вашим заявление. Подробнее
См. в Словарь
и добавьте их в определения переменных в пользовательской структуре данных потока. в том же порядке, чтобы они совпадали:

Пользовательские потоки вершин, показанные в пользовательском интерфейсе модуля Renderer, показывающие некоторые инстансированные и некоторые неэкземплярные потоки.
Пользовательские потоки вершин, показанные в пользовательском интерфейсе модуля Renderer, показывающие некоторые инстансированные и некоторые неэкземплярные потоки.

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

Записи в списке, за которыми следует INSTANCED, содержат данные экземпляра, поэтому вы должны включить их в структуру данных экземпляра частицы. Число, непосредственно добавленное к слову INSTANCED (например, ноль в INSTANCED0 и единица в INSTANCED1), указывает порядок, в котором переменные должны появляться в вашей структуры, после начальной переменной "transform". Буквы в конце (.x .xy .xyz или .xyzw) указывают на тип переменной и сопоставление с типами переменных float, float2, float3 и float4 в коде шейдера.

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

Последний шаг для завершения нашего примера — применить скорость к цвету частиц внутри Вершинного шейдераПрограммы, которая запускается на каждой вершине 3D-модели во время рендеринга модели. Подробнее
См. в Словарь
:

#if defined(UNITY_PARTICLE_INSTANCING_ENABLED) UNITY_PARTICLE_INSTANCE_DATA data = unity_ParticleInstanceData[unity_InstanceID]; o.color.rgb += data.speed; #endif

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

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

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


  • В Unity 2018.1 добавлено создание экземпляров графического процессора Particle System.

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3