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:
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:
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:
appdata_particles
.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"
}