Files
Main/Assets/GameAssets/RawResources/shader/Ares/Gonbest/FallBack/FBWithSimpleShader.shader
2025-01-25 04:38:09 +08:00

208 lines
7.5 KiB
Plaintext

//简单shader
//主要用于场景性能测试替换shader
//by---王圣
Shader "Gonbest/FallBack/FBWithSimpleShader"
{
Properties
{
_Color ("Main Color", Color) = (1, 1, 1, 1)
_ColorMultiplier("Color Multipler",range(0,2)) = 1
_MainTex("Base (RGB)", 2D) = "white" {}
_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
_BumpMap("Normal(RGB)",2D) = "black"{}
_BumpScale("_BumpScale",Range(0,2)) = 1 //发现比率
_EnvPower("_EnvPower",float) = 0.1 //环境高亮的强度
_EnvCube("Env Cube", Cube) = "white" {}
_NoiseMap ("_NoiseMap", 2D) = "white" {}
_NoiseBumpMap ("_NoiseBumpMap", 2D) = "white" {}
_NoiseTiling("_NoiseTiling",float) = 5.2
_NoisePower("_NoisePower",float) = 0.35
_MyShadowMap("Shadow map", 2D) = "black" {} //阴影贴图
_ShadowIntensity("Shadow Intensity",float) = 1 //阴影强度
_ShadowFadeFactor("Shadow Fade Factor",float) = 0 //阴影被材质影响消隐的效果
_Glossiness("_Glossiness",Range(0,1)) = 0.2 //光滑度
_Metallic("_Metallic",Range(0,1)) = 0 //金属度
_MetallicTex("Metallic(R)&Glossiness(G)&AO(B)",2D) = "white"{} //金属度
_SpecularPower("_SpecularPower",Range(0,2)) = 1 //高亮强度
_RainStength("_RainStength",Range(0,10)) = 0 //雨的强度
_RainSpeed("_RainSpeed",Range(-2,2)) = 1 //雨的闪烁速度
_DiffuseColor("EmissiveColor",Color) = (1,1,1,0)
}
CGINCLUDE
#include "../Include/Base/CommonCG.cginc"
#include "../Include/Base/MathCG.cginc"
#include "../Include/Utility/VertexUtilsCG.cginc"
#include "../Include/Utility/FogUtilsCG.cginc"
#include "../Include/Utility/RainUtilsCG.cginc"
#include "../Include/Utility/PixelUtilsCG.cginc"
#include "../Include/Shadow/ShadowCG.cginc"
#include "../Include/Utility/WidgetUtilsCG.cginc"
#include "../Include/Base/EnergyCG.cginc"
#include "../Include/Specular/GGXCG.cginc"
#include "../Include/Base/FresnelCG.cginc"
#include "../Include/Specular/BeckmannCG.cginc"
#include "../Include/Indirect/Lightmap&SHLightCG.cginc"
uniform sampler2D _MainTex;
uniform sampler2D _BumpMap;
uniform float4 _EnvCube_HDR;
UNITY_DECLARE_TEXCUBE(_EnvCube);
uniform sampler2D _MetallicTex;
uniform float4 _MainTex_ST;
uniform float _Glossiness = 0.8; //光滑度
uniform float _Metallic = 0; //金属度
uniform float _SpecularPower = 0.8; //高亮亮度
uniform float _BumpScale = 1; //发现比率
uniform float3 _DiffuseColor;
uniform float _EnvPower;
/*****************************带有lightmap的处理(分开了-_-!,这TM就是一个坑,lightmap处理好像不能放到一个宏判断中.)**********************************************/
struct v2f_lit
{
float4 pos : POSITION;
float4 uv : TEXCOORD0;
float4 wt : TEXCOORD1;
float4 wb : TEXCOORD2;
float4 wn : TEXCOORD3;
GONBEST_FOG_COORDS(4)
GONBEST_SHADOW_COORDS(5)
GONBEST_SH_COORDS(6)
};
//通用功能的vert
v2f_lit vert_lit(appdata_full v)
{
v2f_lit o = (v2f_lit)0;
float4 ppos,wpos;
float3 wt,wn,wb;
GetVertexParameters(v.vertex, v.tangent, v.normal, ppos, wpos, wn, wt, wb);
o.pos = ppos;
o.wt = float4(wt,wpos.x);
o.wb = float4(wb,wpos.y);
o.wn = float4(wn,wpos.z);
o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
o.uv.zw = GONBEST_CALC_LIGHTMAP_UV(v.texcoord1.xy);
GONBEST_TRANSFER_SH(o,wn,wpos);
//阴影处理
GONBEST_TRANSFER_SHADOW_WPOS(o,wpos,v.texcoord1);
//获取雾的采样点
GONBEST_TRANSFER_FOG(o, o.pos, wpos);
return o;
}
//通用的frag
fixed4 frag_lit(v2f_lit i) : COLOR
{
fixed4 mainTex = GONBEST_TEX_SAMPLE(_MainTex, i.uv.xy);
//处理颜色值
GONBEST_APPLY_COLOR_MULTIPLIER(mainTex)
//应用AlphaTest
GONBEST_APPLY_ALPHATEST(mainTex)
float3 emissive = mainTex.xyz;//_DiffuseColor *mainTex.xyz;
//处理粗糙度和金属度
float4 metaColor = tex2D(_MetallicTex,i.uv);
float smoothness = _Glossiness * metaColor.g;
float perceptualRoughness = max(0.08, 1 - smoothness);
float rough = perceptualRoughness * perceptualRoughness;
float meta = _Metallic * metaColor.r;
float specPowner = _SpecularPower ;// * GONBEST_INV_PI;
float ao = GBLerpOneTo (metaColor.b, 1);
//根据能量守恒获取基础的散射光和高亮光颜色
half oneMinusReflectivity;
float3 diffColor,specularColor;
GetDiffuseAndSpecular(mainTex.xyz, meta, diffColor, specularColor, oneMinusReflectivity);
float4 NT = tex2D(_BumpMap,i.uv.xy);
GONBEST_RAIN_NORMAL(NT,i.uv.xy)
float3 N = GetWorldNormalFromBump(NT,_BumpScale,GBNormalizeSafe(i.wt.xyz),GBNormalizeSafe(i.wb.xyz),GBNormalizeSafe(i.wn.xyz));
float3 P = float3(i.wt.w, i.wb.w, i.wn.w);
float3 L = GBNormalizeSafe(_WorldSpaceLightPos0.xyz);
float3 V = GBNormalizeSafe((_WorldSpaceCameraPos.xyz - P.xyz));
float3 H = GBNormalizeSafe(L+V);
float3 R = reflect(-V,N);
float NoH = saturate(dot(N,H));
float NoL = saturate(dot(N,L));
float NoV = saturate(dot(N,V));
float VoH = saturate(dot(H,V));
float GGX = GBGGXSpecularTerm(NoH, NoL,NoV, rough);
float3 F = GBFresnelTermFastWithSpecGreen(specularColor,VoH);
//ggx的高光分布
fixed3 spec = GGX * F * specPowner ;
//间接光
float3 indirectSpec = IndirectSpecular_Custom(UNITY_PASS_TEXCUBE(_EnvCube), _EnvCube_HDR,R,rough,meta) ;
indirectSpec *= SurfaceReductionTerm(rough,perceptualRoughness);
indirectSpec *= GBFresnelLerp(specularColor,GrazingTerm(smoothness,oneMinusReflectivity),NoV);
indirectSpec *= _EnvPower;
//间接散射光处理
float3 indirectDiff = (float3)1;
GONBEST_APPLY_SH_COLOR(i,N,P,indirectDiff);
GONBEST_APPLY_LIGHTMAP_COLOR(i.uv.zw,indirectDiff);
//这里判断是否使用了探针和Lightmap
float useSHorLIGHTMAP = step(0.001,indirectDiff.x+indirectDiff.y+indirectDiff.z);
indirectDiff = lerp((float3)1,indirectDiff,useSHorLIGHTMAP);
//阴影处理
indirectDiff *= GONBEST_DECODE_SHADOW_VALUE(i,P);
float4 outColor = (float4)0;
outColor.rgb += (spec + diffColor) * NoL * _LightColor0.rgb;
outColor.rgb += indirectSpec * ao;
outColor.rgb += emissive * ao;
outColor.a = mainTex.a;
//间接光的处理
outColor.rgb = indirectDiff * outColor.rgb ;
//对应模型雾的颜色
GONBEST_APPLY_FOG(i, outColor.xyz);
return outColor;
}
/***************************************************************************/
ENDCG
SubShader
{
ZTest Less
ZWrite On
Pass
{
//这个Pass使用lightmap和使用阴影
Name "LIGHTMAP&ALPHATEST&ALPHATEX"
Tags { "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert_lit
#pragma fragment frag_lit
#pragma fragmentoption ARB_precision_hint_fastest
#pragma multi_compile _GONBEST_SHADOW_ON _GONBEST_SHADOW_OFF
#pragma multi_compile _GONBEST_RAIN_BUMP_ON _GONBEST_RAIN_BUMP_OFF
#pragma multi_compile _GONBEST_ALPHA_TEST_ON
#pragma multi_compile _GONBEST_ALPHA_TEX_ON
#pragma multi_compile _GONBEST_COLOR_MULTIPLIER_ON
#pragma multi_compile _GONBEST_INDIRECT_DIFFUSE_ON
#pragma multi_compile LIGHTMAP_ON LIGHTPROBE_SH
#pragma multi_compile _GONBEST_HEIGHT_FOG_ON _GONBEST_HEIGHT_FOG_OFF
#pragma multi_compile _GONBEST_CUSTOM_SHADOW_ON
#pragma multi_compile_fog
#pragma target 3.0
ENDCG
}
}
FallBack "Diffuse"
}