庄懂15/16课 火焰和水流动实例

庄懂老师https://space.bilibili.com/6373917?spm_id_from=333.788.b_765f7570696e666f.1

 RG通道分别是外焰和内焰,右侧分别为扰动图

Shader "Unlit/co13-fire"
{
    Properties
    {
       _Mask         ("R:外焰 G:内焰 B:透贴",2d)           = "black"{}
	   _Noise        ("R:噪波1号 G:噪波2号" ,2d)            = "gray" {}
	   _Noise1Params ("噪声1 X:大小 Y:流速 Z:强度",vector)=(1.0,0.2,0.2,1.0)
       _Noise2Params ("噪声2 X:大小 Y:流速 Z:强度",vector)=(1.0,0.2,0.2,1.0)
       [HDR]_Col1    ("外焰颜色", color)                    =(1.0, 1.0, 1.0, 1.0)
	   [HDR]_Col2    ("内焰颜色", color)                    =(1.0, 1.0, 1.0, 1.0)
  }
    SubShader
    {
        Tags { 
		"Queue"               = "Transparent" //加个渲染序列,调整渲染顺序
		"RenderType"          = "Transparent"
		"ForceNoShadowCasting"= "True"  //特效里默认关闭阴影投影
		"IgnoreProjector"     = "True"  //特效里默认不响应投射器
		}

        Pass
        {
		    Tags{"LightMode" = "ForwardBase"}
			Blend SrcAlpha OneMinusSrcAlpha  //修改混合方式
            
			CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

			uniform sampler2D _Mask;
			uniform sampler2D _Noise;
			uniform half3     _Noise1Params;
			uniform half3     _Noise2Params;
			uniform half3     _Col1;
			uniform half3     _Col2;

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv     : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv0 : TEXCOORD0;//采样mask
				float2 uv1 : TEXCOORD1;//采样噪波1
				float2 uv2 : TEXCOORD2;//采样噪波2
                float4 pos : SV_POSITION;
            };

           
            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv0 = v.uv;
				o.uv1 = v.uv*_Noise1Params.x-float2(0.0,frac(_Time.x*_Noise1Params.y));//float2将流动变换改为二维向量,只在对应位置与前面的向量相加
				o.uv2 = v.uv*_Noise2Params.x-float2(0.0,frac(_Time.x*_Noise2Params.y));
                return o;
            }

            fixed4 frag (v2f i) : COLOR
            {
			    half var_Noise1   = tex2D (_Noise,i.uv1).r;
				half var_Noise2   = tex2D (_Noise,i.uv2).g;
				half noise        = var_Noise1*_Noise1Params.z+var_Noise2*_Noise2Params.z;
			
			    float2 WarpUV     = i.uv0 - float2(0.0, noise);
				float3 var_Mask   = tex2D(_Mask,WarpUV);
				half3 finalCorlor = var_Mask.r*_Col1+var_Mask.g*_Col2;
				half   opacity    = var_Mask.b;//根据贴图设定
                return half4(finalCorlor,opacity );
            }
            ENDCG
        }
    }FallBack "Diffuse"
}

用一张噪波图,RG通道不同的噪波去扰动

Shader "Unlit/water"
{
	Properties{
        _MainTex ("颜色贴图",2d)="white"{}
        _WarpTex ("扰动图",2d)="gray"{}
		_WarpTEXParms("X:速度X Y :流速Y",vector)=(1,1,1,1)
        _Warp1Parms("X:大小,Y:速度X Z :流速Y W:强度",vector)=(1,1,1,1)
        _Warp2Parms("X:大小,Y:速度X Z :流速Y W:强度",vector)=(1,1,1,1)
	}
		SubShader{ 
            Pass {
  

			Tags {
            "LightMode" = "ForwardBase"
            "Queue"="Transparent"
			"RenderType"="TransparentCutout" // 对应改为Cutout(在此处无用,为了规范以及其他情况可能使用)
            "ForceNoShadowCasting"="True" // 关闭阴影投射
            "IgnoreProjector"="True" // 不响应投射器       
			}
            Blend One OneMinusSrcAlpha


			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"

			uniform sampler2D _MainTex; uniform float4 _MainTex_ST;
            uniform sampler2D _WarpTex; 
			uniform half4 _Warp1Parms;
            uniform half4 _Warp2Parms;
			uniform half2 _WarpTEXParms;
			 


		struct VertexInput {
			float4 vertex : POSITION; //老朋友顶点位置
			float2 uv:TEXCOORD0;     //uv信息采样贴图用
		};
		struct VertexOutput {
			float4 pos : SV_POSITION;
			float2 uv0:TEXCOORD0;
            float2 uv1:TEXCOORD1;
            float2 uv2:TEXCOORD2;
		};
		VertexOutput vert(VertexInput v) {
			VertexOutput o = (VertexOutput)0;
			o.pos = UnityObjectToClipPos(v.vertex);
            o.uv0=v.uv-frac(_Time.x*_WarpTEXParms.xy);
            o.uv1 =v.uv*_Warp1Parms.x-frac(_Time.x*_Warp1Parms.yz);
            o.uv2 =v.uv*_Warp2Parms.x-frac(_Time.x*_Warp2Parms.yz);

			return o;
		}
		float4 frag(VertexOutput i) : COLOR {
            half3 var_Warp1=tex2D(_WarpTex,i.uv1).rgb;//扰动1
            half3 var_Warp2=tex2D(_WarpTex,i.uv2).rgb;//扰动2
            //扰动混合
            half2 warp=(var_Warp1-0.5)*_Warp1Parms.w+(var_Warp2-0.5)*_Warp2Parms.w;
			//扰动UV
			float2 warpUV=i.uv0+warp;
			//采样uv
			half4 var_MainTex=tex2D(_MainTex,warpUV);

           return var_MainTex;//float4(var_MainTex.xyz,1);
		}
		ENDCG
	}
	}
		FallBack "Diffuse"

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值