c1_unity/Assets/arts/shaders/models/scene_diffuse_bump_clip.shader
2023-04-03 11:04:31 +08:00

161 lines
6.2 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Shader "R1/Scene/Scene_DiffuseBump_Clip" {
Properties {
[NoScaleOffset]_MainTex ("主帖图", 2D) = "white" {}
[NoScaleOffset]_FunctionMap("法线贴图", 2D) = "black" {}
_Clip("裁剪范围",Range(0 , 1)) = 0.5
_Emmision("自发光强度", Range(0, 5)) = 0
[HDR]_EmmisionColor("自发光颜色",Color) = (1,1,1,0)
[Space(40)]
[Header(Use vertex color control animation)]
[Space]
[Toggle(_WIND_ON)]_windOn("开启顶点动画",float) = 0
_Frequency("摇晃频率", Range(0 , 1)) = 0.2
_Strength("摇晃幅度", Range(0 , 1)) = 0.2
_Scale("摇晃范围",Range(0 , 5)) = 1
[Toggle] _ZWrite("写入深度", Float) = 1
}
SubShader
{
Tags {"RenderType" = "TransparentCutout" "Queue" = "AlphaTest"}
CGINCLUDE
#pragma multi_compile __ _WIND_ON
uniform sampler2D _MainTex;
uniform float _Clip;
uniform fixed4 _EmmisionColor;
ENDCG
Pass {
Tags {"LightMode" = "ForwardBase"}
Cull Off
ZWrite [_ZWrite]
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
#pragma skip_variants LIGHTPROBE_SH LIGHTMAP_ON DYNAMICLIGHTMAP_ON DIRLIGHTMAP_COMBINED LIGHTMAP_SHADOW_MIXING SHADOWS_SHADOWMASK VERTEXLIGHT_ON
#pragma multi_compile_instancing
#pragma multi_compile_fwdbase
#pragma multi_compile_fog
#pragma multi_compile __ _USEPOINTLIGHT_ON
#include "UnityCG.cginc"
#include "AutoLight.cginc"
#include "Lighting.cginc"
#include "CloudInclude.cginc"
#include "DiffuseInclude.cginc"
#include "SideInclude.cginc"
#ifdef _USEPOINTLIGHT_ON
#include "PointlightInclude.cginc"
#endif
#ifdef _WIND_ON
#include "NoiseInclude.cginc"
#endif
uniform sampler2D _FunctionMap;
uniform float _Emmision;
VertexOutput vert (VertexInput v) {
VertexOutput o = (VertexOutput)0;
UNITY_SETUP_INSTANCE_ID(v);
//UNITY_TRANSFER_INSTANCE_ID(v, o);
o.uv.xy = v.uv;
o.normalDir.xyz = normalize(UnityObjectToWorldNormal(v.normal));
o.tangentDir = normalize(mul(unity_ObjectToWorld, v.tangent.xyz).xyz);
o.bitangentDir = normalize(cross(o.normalDir, o.tangentDir) * v.tangent.w);
o.posWorld = mul(unity_ObjectToWorld, v.vertex);
//风
#ifdef _WIND_ON
v.vertex.xyz += FinalPerlin(v.vertex,v.color,_Time.y);//风有include
#endif
o.pos = UnityObjectToClipPos(v.vertex);
o.uv.zw = 0;//没有用到的分量
UNITY_TRANSFER_FOG(o,o.pos);
TRANSFER_VERTEX_TO_FRAGMENT(o)
return o;
}
float4 frag(VertexOutput i) : COLOR{
//UNITY_SETUP_INSTANCE_ID(i);
fixed2 _uv = i.uv.xy;//UV
fixed4 _mainTex = tex2D(_MainTex, _uv);//采样主帖图
fixed4 _normalTex = tex2D(_FunctionMap, _uv);//采样法线贴图
fixed3 _normalMap = UnpackNormal(_normalTex);//解包法线
float3x3 _tangentTransform = float3x3(i.tangentDir, i.bitangentDir, i.normalDir.xyz);//切线空间到世界空间矩阵
_normalMap = normalize(mul(_normalMap, _tangentTransform));//法线转到世界空间
_normalMap = _normalTex.x != 0 ? _normalMap : i.normalDir;//如果没有法线贴图,则使用模型自身法线
fixed3 _finalRGB = Diffuse(_normalMap,_mainTex,i);//光照有include
_finalRGB *= _mainTex.rgb;//乘以主帖图
fixed3 _emission = _mainTex.rgb * _Emmision * _normalTex.a;//自发光,基于主帖图颜色
_finalRGB += _emission;//输出颜色加上自发光
_finalRGB = AddCloud(i.posWorld,_uv,_finalRGB);//云投影有include
_finalRGB *= _EmmisionColor;
//点光源有include
#ifdef _USEPOINTLIGHT_ON
_finalRGB += PointLight(_normalMap,i.posWorld);
#endif
UNITY_APPLY_FOG(i.fogCoord, _finalRGB);//雾
//_finalRGB = AddSide(i.posWorld.xz, _finalRGB);//暗边
clip(_mainTex.a - _Clip);//裁剪
return fixed4(_finalRGB,1);
}
ENDCG
}
//shadow
Pass
{
Name "ShadowCaster"
Tags { "LightMode" = "ShadowCaster" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma target 2.0
#pragma multi_compile_shadowcaster
#pragma multi_compile_instancing
#include "UnityCG.cginc"
#ifdef _WIND_ON
#include "NoiseInclude.cginc"
#endif
struct VertexInput {
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float4 color : COLOR;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct VertexOutput {
V2F_SHADOW_CASTER;
float2 uv : TEXCOORD1;
//UNITY_VERTEX_INPUT_INSTANCE_ID
};
VertexOutput vert(VertexInput v)
{
VertexOutput o = (VertexOutput)0;
UNITY_SETUP_INSTANCE_ID(v);
//UNITY_TRANSFER_INSTANCE_ID(v, o);
o.uv = v.uv.xy;
//风
#ifdef _WIND_ON
v.vertex.xyz += FinalPerlin(v.vertex,v.color,_Time.y);//风有include
#endif
TRANSFER_SHADOW_CASTER(o)
return o;
}
float4 frag(VertexOutput i) : SV_Target
{
//UNITY_SETUP_INSTANCE_ID(i);
float4 _mainTex = tex2D(_MainTex, i.uv);
clip(_mainTex.a - _Clip);
SHADOW_CASTER_FRAGMENT(i)
}
ENDCG
}
}
}