庄懂老师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"
}