Files
JJBB/Assets/Project/Shader/T4M 4 Textures.shader
2024-08-23 15:49:34 +08:00

139 lines
3.5 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.

// AuthorBlastom
// 这个Shader只用于Non-Directional烘培的物体动态物体使用光照会不正常
// 支持GLES 2.0包括Shader Level 2.0的机器T4MBase
// 特别减少Vert传输到Frag的参数数目因此无法使用surface。
// 升级Unity版本如果有算法改变需要特殊处理。
Shader "Zhanyou/Scene/T4M 4 Textures" {
Properties {
_Splat0 ("Layer 1", 2D) = "white" {}
_Splat1 ("Layer 2", 2D) = "white" {}
_Splat2 ("Layer 3", 2D) = "white" {}
_Splat3 ("Layer 4", 2D) = "white" {}
[NoScaleOffset]_Control ("Control (RGBA)", 2D) = "white" {}
_Emission("Emission", Float) = 1.0
}
CGINCLUDE
#include "T4MBase.cginc"
ENDCG
SubShader {
Tags {
// 最后绘制,以最大限度剔除高消耗像素
"Queue"="AlphaTest+1"
"SplatCount" = "4"
"RenderType" = "Opaque"
}
// Forward Base
Pass
{
Name "FORWARD"
Tags { "LightMode" = "ForwardBase" }
CGPROGRAM
#define UNITY_PASS_FORWARDBASE
#pragma multi_compile_fwdbase
#pragma multi_compile_fog
#pragma vertex vert_Base
#pragma fragment frag
#pragma multi_compile __ PLAYER_HALO_ON
fixed4 frag(v2f_Base i) : SV_TARGET
{
COLOR_FRAG;
// 世界法线
fixed3 worldNormal = fixed3(i.tSpace0.z, i.tSpace1.z, i.tSpace2.z);
GET_UNITY_GI_COLOR;
// 自发光功能
c.rgb = giColor + c.rgb * _Emission;
#if PLAYER_HALO_ON
c.rgb += _DirectionalLightColor * LightColorFromWorld(worldPos);
#endif
UNITY_APPLY_FOG(i.fogCoord, c);
UNITY_OPAQUE_ALPHA(c.a);
return c;
}
ENDCG
}
// Forward Add
// 注实际光照贴图只通过meta通道实现Forward Add仅用于编辑器无光照贴图时预览
// 简单处理Forward Add也使用顶点计算光照和视野方向真实光照参数
// 该通道可以省去镜面高光等所需参数,因此按常规算法做
Pass
{
Name "FORWARD_ADD"
Tags { "LightMode" = "ForwardAdd" }
ZWrite Off
Blend One One
CGPROGRAM
#define UNITY_PASS_FORWARDADD
#include "UnityCG.cginc"
#include "Lighting.cginc"
#include "AutoLight.cginc"
#include "Gles2Helper.cginc"
#pragma multi_compile_fwdadd
#pragma multi_compile_fog
#pragma skip_variants INSTANCING_ON
#pragma vertex vert_Add
#pragma fragment frag
fixed4 frag(v2f_Add i) : SV_TARGET
{
#ifdef LIGHTMAP_ON
fixed4 c = fixed4(0.0, 0.0, 0.0, 0.0);
#else
COLOR_FRAG;
UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);
half NtoL = max(0.0, i.lightDir.z);
c.rgb = c.rgb * atten * _LightColor0.rgb * NtoL;
#endif
UNITY_APPLY_FOG(i.fogCoord, c);
UNITY_OPAQUE_ALPHA(c.a);
return c;
}
ENDCG
}
// Meta
Pass
{
Name "Meta"
Tags { "LightMode" = "Meta" }
Cull Off
CGPROGRAM
#define UNITY_PASS_META
#include "UnityCG.cginc"
#include "UnityMetaPass.cginc"
#pragma vertex vert
#pragma fragment frag
#pragma skip_variants FOG_LINEAR FOG_EXP FOG_EXP2
#pragma skip_variants INSTANCING_ON
struct v2f {
float4 pos : SV_POSITION;
float4 uv : TEXCOORD0;
};
v2f vert(appdata_full v) {
v2f o;
UNITY_INITIALIZE_OUTPUT(v2f, o);
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
return o;
}
fixed4 frag(v2f i) : SV_TARGET
{
COLOR_FRAG;
UnityMetaInput metaIN;
UNITY_INITIALIZE_OUTPUT(UnityMetaInput, metaIN);
metaIN.Albedo = c.rgb;
metaIN.Emission = c.rgb * _Emission;
return UnityMetaFragment(metaIN);
}
ENDCG
}
}
Fallback "Diffuse"
}