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 - 片段级模型动态变色(实现汽车动态换漆)

Shader2.0的顶点着色器和片段着色器

UnityShader之顶点片段着色器Vertex and Fragment ShaderShader资料

Unity Shader入门精要学习笔记 - 第5章 开始 Unity Shader 学习之旅

深入URP之Shader篇1: URP Shader概述