shader之——shadeGun代码分析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shader之——shadeGun代码分析相关的知识,希望对你有一定的参考价值。
shadeGun是官方一个很早的demo,但是里面的东西真的是值得一学
1.烟火,大多数人都是选择粒子来做这样的烟火,在shadeGun中只是用了一个片
搞定了如此真实的烟火,效率上面真的是比粒子好的不是一般的多。
// Upgrade NOTE: replaced ‘mul(UNITY_MATRIX_MVP,*)‘ with ‘UnityObjectToClipPos(*)‘ Shader "MADFINGER/Environment/Scroll 2 Layers Sine AlphaBlended" { Properties { _MainTex ("Base layer (RGB)", 2D) = "white" {} //贴图1 _DetailTex ("2nd layer (RGB)", 2D) = "white" {} //贴图2 _ScrollX ("Base layer Scroll speed X", Float) = 1.0 //贴图1的x方向速度 _ScrollY ("Base layer Scroll speed Y", Float) = 0.0 //贴图1的y方向速度 _Scroll2X ("2nd layer Scroll speed X", Float) = 1.0 //贴图2的x方向速度 _Scroll2Y ("2nd layer Scroll speed Y", Float) = 0.0 //贴图2的y方向速度 _SineAmplX ("Base layer sine amplitude X",Float) = 0.5 //贴图1 x方向的扭动幅度 _SineAmplY ("Base layer sine amplitude Y",Float) = 0.5 //贴图1 y方向的扭动幅度 _SineFreqX ("Base layer sine freq X",Float) = 10 //贴图1 x方向的扭动速度 _SineFreqY ("Base layer sine freq Y",Float) = 10 //贴图1 y方向的扭动速度 _SineAmplX2 ("2nd layer sine amplitude X",Float) = 0.5 //贴图2 x方向的扭动幅度 _SineAmplY2 ("2nd layer sine amplitude Y",Float) = 0.5 //贴图2 y方向的扭动幅度 _SineFreqX2 ("2nd layer sine freq X",Float) = 10 //贴图2 x方向的扭动速度 _SineFreqY2 ("2nd layer sine freq Y",Float) = 10 //贴图2 y方向的扭动速度 _Color("Color", Color) = (1,1,1,1) //主颜色 _MMultiplier ("Layer Multiplier", Float) = 2.0 //亮度 } SubShader { Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } Blend SrcAlpha OneMinusSrcAlpha Cull Off ZWrite Off LOD 100 CGINCLUDE #pragma multi_compile LIGHTMAP_OFF LIGHTMAP_ON #pragma exclude_renderers molehill #include "UnityCG.cginc"
sampler2D _MainTex; sampler2D _DetailTex; float4 _MainTex_ST; float4 _DetailTex_ST;
float _ScrollX; float _ScrollY; float _Scroll2X; float _Scroll2Y; float _MMultiplier;
float _SineAmplX; float _SineAmplY; float _SineFreqX; float _SineFreqY; float _SineAmplX2; float _SineAmplY2; float _SineFreqX2; float _SineFreqY2; float4 _Color; struct v2f { float4 pos : SV_POSITION; float4 uv : TEXCOORD0; fixed4 color : TEXCOORD1; }; ///核心代码 v2f vert (appdata_full v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.uv.xy = TRANSFORM_TEX(v.texcoord.xy,_MainTex) + frac(float2(_ScrollX, _ScrollY) * _Time);//贴图1的uv动画 frac(x) 返回标量或矢量的小数 o.uv.zw = TRANSFORM_TEX(v.texcoord.xy,_DetailTex) + frac(float2(_Scroll2X, _Scroll2Y) * _Time);//贴图2的uv动画 o.uv.x += sin(_Time * _SineFreqX) * _SineAmplX;//每个方向做曲线变化,sin里面的影响变化速度,x在外面的参数影响曲线范围 o.uv.y += sin(_Time * _SineFreqY) * _SineAmplY; o.uv.z += sin(_Time * _SineFreqX2) * _SineAmplX2; o.uv.w += sin(_Time * _SineFreqY2) * _SineAmplY2; o.color = _MMultiplier * _Color * v.color; //亮度 * 颜色 * 顶点色 return o; } ENDCG Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag fixed4 frag (v2f i) : COLOR { fixed4 o; fixed4 tex = tex2D (_MainTex, i.uv.xy); fixed4 tex2 = tex2D (_DetailTex, i.uv.zw); o = tex * tex2 * i.color; return o; } ENDCG } } }
以上是关于shader之——shadeGun代码分析的主要内容,如果未能解决你的问题,请参考以下文章
Cg入门19:Fragment shader - 片段级模型动态变色
Cg入门20:Fragment shader - 片段级模型动态变色(实现汽车动态换漆)
UnityShader之顶点片段着色器Vertex and Fragment ShaderShader资料