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

Потоки вершин системы частиц и поддержка стандартных шейдеров

Если вам удобно писать собственные шейдерыпрограмму, работающую на графическом процессоре. Подробнее
См. в Словарь
, используйте это дополнение к Модуль визуализации для настройки Систем частицКомпонент, имитирующий жидкость объектов, таких как жидкости, облака и пламя, путем создания и анимации большого количества небольших 2D-изображений в сцене. Подробнее
См. Словарь
, чтобы передавать более широкий диапазон данных в ваши пользовательские шейдеры.

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

  • Используйте поток Tangent для поддержки частиц с картой нормалей.
  • Вы можете удалить Color, а затем добавить Tangent UV2 и AnimBlend потоки для использования стандартного шейдера на частицах.
  • Чтобы легко выполнять линейное смешивание текстур флипбуков, добавьте потоки UV2 и AnimBlend и подключите шейдер Particles/Animal Alpha Blended (см. пример снимка экрана ниже, чтобы узнать, как это настроить).

Есть также два полностью настраиваемых потока данных для каждой частицы (ParticleSystemVertexStreams.Custom1 и ParticleSystemVertexStreams.Custom2), который можно заполнить из скрипта. Вызовите SetCustomParticleData и GetCustomParticleData с массивом данных, чтобы использовать их. . Есть два способа использовать это:

  • Для управления пользовательским поведением в скриптахЧасть кода, позволяющая создавать собственные компоненты, запускать игровые события, изменять Свойства компонента с течением времени и реагировать на ввод пользователя любым удобным для вас способом. Подробнее
    Посмотреть в Словарь
    , присоединив к частицам собственные данные; например, присваивая каждой частице значение "здоровье".
  • Чтобы передать эти данные в шейдер, добавив один из двух пользовательских потоков, так же, как вы отправляете любой другой поток в шейдер (см. ParticleSystemRenderer .EnableVertexStreams). Чтобы уточнить первый пример, возможно, ваш пользовательский атрибут здоровья теперь может также управлять каким-то визуальным эффектом, а также управлять игровой логикой на основе сценариев.

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

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

struct appdata_t { float4 vertex : POSITION; float3 normal : NORMAL; fixed4 color : COLOR; float4 texcoords : TEXCOORD0; float texcoordBlend : TEXCOORD1; };

Обратите внимание, что и UV, и UV2 передаются в разных частях TEXCOORD0, поэтому мы используем одно объявление для обоих. Чтобы получить доступ к каждому из них в вашем шейдере, вы должны использовать swizzles xy и zw. Это позволяет эффективно упаковывать данные вершин.

Вот пример анимированного шейдера флипбука. Он использует входные данные по умолчанию (Положение, НормальноеНаправление, перпендикулярное поверхности сетки, представленное вектором. Unity использует нормали для определения ориентации объекта и применения затенения. Подробнее
См. в Словарь
, Цвет, UV), но также использует два дополнительных потока для второго UV-потока (UV2) и информации о кадре флипбука (AnimBlend).

Shader "Particles/Anim Alpha Blended" { Properties { _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5) _MainTex ("Particle Texture", 2D) = "white" {} _InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0 } Category { Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" } Blend SrcAlpha OneMinusSrcAlpha ColorMask RGB Cull Off Lighting Off ZWrite Off SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 2.0 #pragma multi_compile_particles #pragma multi_compile_fog #include "UnityCG.cginc" sampler2D _MainTex; fixed4 _TintColor; struct appdata_t { float4 vertex : POSITION; fixed4 color : COLOR; float4 texcoords : TEXCOORD0; float texcoordBlend : TEXCOORD1; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct v2f { float4 vertex : SV_POSITION; fixed4 color : COLOR; float2 texcoord : TEXCOORD0; float2 texcoord2 : TEXCOORD1; fixed blend : TEXCOORD2; UNITY_FOG_COORDS(3) #ifdef SOFTPARTICLES_ON float4 projPos : TEXCOORD4; #endif UNITY_VERTEX_OUTPUT_STEREO }; float4 _MainTex_ST; v2f vert (appdata_t v) { v2f o; UNITY_SETUP_INSTANCE_ID(v); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); o.vertex = UnityObjectToClipPos(v.vertex); #ifdef SOFTPARTICLES_ON o.projPos = ComputeScreenPos (o.vertex); COMPUTE_EYEDEPTH(o.projPos.z); #endif o.color = v.color * _TintColor; o.texcoord = TRANSFORM_TEX(v.texcoords.xy,_MainTex); o.texcoord2 = TRANSFORM_TEX(v.texcoords.zw,_MainTex); o.blend = v.texcoordBlend; UNITY_TRANSFER_FOG(o,o.vertex); return o; } sampler2D_float _CameraDepthTexture; float _InvFade; fixed4 frag (v2f i) : SV_Target { #ifdef SOFTPARTICLES_ON float sceneZ = LinearEyeDepth (SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))); float partZ = i.projPos.z; float fade = saturate (_InvFade * (sceneZ-partZ)); i.color.a *= fade; #endif fixed4 colA = tex2D(_MainTex, i.texcoord); fixed4 colB = tex2D(_MainTex, i.texcoord2); fixed4 col = 2.0f * i.color * lerp(colA, colB, i.blend); UNITY_APPLY_FOG(i.fogCoord, col); return col; } ENDCG } } } }

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

  • Входная структура вашей функции поверхности отличается от входной структуры вершинного шейдера. Вам необходимо предоставить собственную структуру входных данных вершинного шейдера. Ниже приведен пример, где он называется appdata_particles.
  • При построении поверхностных шейдеров происходит автоматическая обработка переменных, имена которых начинаются с определенных токенов. Наиболее заметным из них является uv. Чтобы автоматическая обработка не вызывала здесь проблем, обязательно дайте своим входным UV-разверткам разные имена (например, «texcoord»).

Та же функциональность, что и в первом примере, но в поверхностном шейдере:

Shader "Particles/Anim Alpha Blend Surface" { 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 {"Queue"="Transparent" "RenderType"="Transparent"} Blend SrcAlpha OneMinusSrcAlpha ZWrite off LOD 200 CGPROGRAM // Physically based Standard lighting model, and enable shadows on all light types #pragma surface surf Standard alpha vertex:vert // Use shader model 3.0 target, to get nicer looking lighting #pragma target 3.0 sampler2D _MainTex; struct appdata_particles { float4 vertex : POSITION; float3 normal : NORMAL; float4 color : COLOR; float4 texcoords : TEXCOORD0; float texcoordBlend : TEXCOORD1; }; struct Input { float2 uv_MainTex; float2 texcoord1; float blend; float4 color; }; void vert(inout appdata_particles v, out Input o) { UNITY_INITIALIZE_OUTPUT(Input,o); o.uv_MainTex = v.texcoords.xy; o.texcoord1 = v.texcoords.zw; o.blend = v.texcoordBlend; o.color = v.color; } half _Glossiness; half _Metallic; fixed4 _Color; void surf (Input IN, inout SurfaceOutputStandard o) { fixed4 colA = tex2D(_MainTex, IN.uv_MainTex); fixed4 colB = tex2D(_MainTex, IN.texcoord1); fixed4 c = 2.0f * IN.color * lerp(colA, colB, IN.blend) * _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" }
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3