Menggunakan Sistem Partikel Built-in
Sistem Partikel GPU Login

Sistem Partikel aliran simpul dan dukungan Shader Standar

Jika Anda nyaman menulis ShadersProgram yang berjalan di GPU. More info
Lihat di Glossary
Anda sendiri, gunakan tambahan ini untuk Modul Renderer untuk mengkonfigurasi Particle SystemsKomponen yang mensimulasikan entitas fluida seperti cairan, awan dan nyala dengan menghasilkan dan memikat sejumlah besar gambar 2D kecil di tempat kejadian. More info
Lihat di Glossary
Anda untuk lulus berbagai data ke Shaders kustom Anda.

Ada sejumlah built-in aliran data untuk dipilih, seperti kecepatan, ukuran dan posisi pusat. Selain kemampuan untuk membuat Shader kustom yang kuat, aliran ini memungkinkan sejumlah manfaat yang lebih umum:

  • Gunakan aliran Tangent untuk mendukung partikel mapan normal.
  • Anda dapat menghapus warna dan kemudian menambahkan aliran Tangent UV2 dan AnimBlend untuk menggunakan Standar Shader pada partikel.
  • Untuk dengan mudah melakukan campuran tekstur linier buku flip, tambahkan aliran UV2 dan AnimBlend, dan melampirkan Partikel / Anim Alpha Blended Shader (lihat contoh screenshot di bawah ini untuk melihat cara mengatur ini).

Ada juga dua aliran data per-partikel kustom (PartikelVertexStreams.Custom1 dan PartikelVertexStreams.Custom2), yang dapat diisi dari skrip. Hubungi SetCustomParticleData dan GetCustomParticleData dengan array data Anda untuk menggunakannya. Ada dua cara menggunakan ini:

  • Untuk mendorong perilaku kustom di scriptsSepotong kode yang memungkinkan Anda untuk membuat Komponen Anda sendiri, memicu peristiwa permainan, memodifikasi sifat komponen dari waktu ke waktu dan menanggapi input pengguna dengan cara apa pun yang Anda sukai. More info
    Lihat di Glossary
    dengan melampirkan data Anda sendiri ke partikel; misalnya, melampirkan nilai “health” ke setiap partikel.
  • Untuk lulus data ini ke Shader dengan menambahkan salah satu dari dua aliran kustom, dengan cara yang sama Anda akan mengirim aliran lain ke Shader Anda (lihat PartikelSystemRenderer.EnableVertexStreams). Untuk dijelaskan pada contoh pertama, mungkin atribut kesehatan kustom Anda sekarang juga dapat menggerakkan beberapa jenis efek visual, serta logika permainan berbasis skrip.

Saat menambahkan aliran simpul, Unity akan memberi Anda beberapa informasi dalam kurung, di samping setiap item, untuk membantu Anda membaca data yang benar di naungan Anda:

Setiap item dalam kurung sesuai dengan input Vertex ShaderProgram yang berjalan pada setiap simpul model 3D ketika model sedang diberikan. More info
Lihat di Glossary
, yang harus Anda tentukan dalam Shader Anda. Berikut adalah struktur input yang benar untuk konfigurasi ini.

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

Perhatikan bahwa UV dan UV2 dilewatkan dalam berbagai bagian TEXCOORD0, jadi kami menggunakan deklarasi tunggal untuk keduanya. Untuk mengakses setiap orang di naungan Anda, Anda akan menggunakan swizzle xy dan zw. Ini memungkinkan Anda untuk mengemas data simpul Anda secara efisien.

Berikut ini adalah contoh dari buku flip animasi Shader. Ini menggunakan input default (Position, NormalArah tegak lurus ke permukaan jala, diwakili oleh vektor. Unity menggunakan normal untuk menentukan orientasi objek dan menerapkan pencukur. More info
Lihat di Glossary
, Color, UV), tetapi juga menggunakan dua aliran tambahan untuk aliran UV kedua (UV2) dan informasi bingkai buku flip (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 
        }
    }   
}
}


Hal ini juga memungkinkan untuk menggunakan Surface ShadersCara merampingkan naungan menulis untuk Pipeline Render Built-in. More info
Lihat di Glossary
dengan sistem ini, meskipun ada beberapa hal tambahan untuk menyadari:

  • Struktur input ke fungsi permukaan Anda tidak sama dengan struktur input ke Shader simpul. Anda harus menyediakan struktur input simpul vertex Shader Anda sendiri. Lihat di bawah ini misalnya, di mana itu disebut appdata_particles.
  • Ketika permukaan Shaders dibangun, ada penanganan variabel otomatis yang namanya dimulai dengan token tertentu. Yang paling terkenal adalah uv. Untuk mencegah penanganan otomatis dari menyebabkan masalah di sini, pastikan untuk memberikan input UV Anda nama yang berbeda (misalnya, "texcoord").

Berikut ini adalah fungsi yang sama dengan contoh pertama, tetapi dalam Shader Permukaan:

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"
}


  • 2017–05–15 Login
Menggunakan Sistem Partikel Built-in
Sistem Partikel GPU Login