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

199 lines
6.2 KiB
Plaintext

Shader "Gonbest/Legacy/SkyHelper"
{
Properties
{
_Color ("Main Color", Color) = (1, 1, 1, 1)
_ColorMultiplier("Color Multipler",range(0,2)) = 1
_MainTex("Base (RGB)", 2D) = "white" {}
_FogFactor("_FogFactor",float) = 0.5
_SkyColor ("Sky Color", Color) = (0.02553246,0.03709318,0.1827586,1)
_GroundColor ("Ground Color", Color) = (0.06617647,0.5468207,1,1)
[HDR]_SunColor("SunColor",Color) = (1,1,1,1)
_SunRadiusB ("Sun Radius B", Range(0, 1)) = 0
_SunRadiusA ("Sun Radius A", Range(0, 1)) = 0
_SunIntensity ("Sun Intensity", Float ) = 2
_HorizonColor ("HorizonColor", Color) = (0.6838235,0.9738336,1,1)
_Horizon2Size ("Horizon2 Size", Range(0, 8)) = 1.755868
_Horion1Size ("Horion1 Size", Range(0, 8)) = 8
_SkyupColor ("Sky up", Color) = (0,0.1332658,0.2647059,1)
_CloudsCube ("Clouds", Cube) = "black" {}
}
CGINCLUDE
#include "../Include/Base/CommonCG.cginc"
#include "../Include/Base/MathCG.cginc"
#include "../Include/Shadow/ShadowCG.cginc"
#include "../Include/Utility/FogUtilsCG.cginc"
#include "../Include/Utility/WidgetUtilsCG.cginc"
#include "../Include/Indirect/Lightmap&SHLightCG.cginc"
uniform sampler2D _MainTex;
uniform float4 _MainTex_ST;
//雾的参数
uniform float _FogFactor;
uniform float4 _SkyColor;
uniform float4 _GroundColor;
uniform float4 _SunColor;
uniform float _SunRadiusB;
uniform float _SunRadiusA;
uniform float _SunIntensity;
uniform float4 _HorizonColor;
uniform float _Horizon2Size;
uniform float _Horion1Size;
uniform float4 _SkyupColor;
uniform samplerCUBE _CloudsCube;
struct v2f_sky
{
float4 pos : POSITION;
half4 uv : TEXCOORD0;
GONBEST_FOG_COORDS(1)
};
//通用功能的vert
v2f_sky vert_skybox(appdata_full v)
{
v2f_sky o = (v2f_sky)0;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv.xy = TRANSFORM_TEX(v.texcoord, _MainTex);
float3 wpos = mul(unity_ObjectToWorld,v.vertex).xyz;
//获取雾的采样点
GONBEST_TRANSFER_FOG(o, o.pos, wpos);
return o;
}
//天空盒子的frag
fixed4 frag_skybox( v2f_sky i ) : COLOR
{
fixed4 mainTex = tex2D(_MainTex, i.uv.xy);
GONBEST_APPLY_COLOR_MULTIPLIER(mainTex)
//对应模型雾的颜色
GONBEST_APPLY_FOG(i, mainTex);
mainTex.rgb = lerp(mainTex.rgb, unity_FogColor.rgb, _FogFactor);
#if defined(_GONBEST_SPEC_ALPHA_ON)
mainTex.a = 0;
#endif
return mainTex;
}
struct v2f_mksky
{
float4 pos : POSITION;
float4 wpos : TEXCOORD0;
float3 wnormal : TEXCOORD1;
GONBEST_FOG_COORDS(1)
};
v2f_mksky vert_mksky (appdata_full v)
{
v2f_mksky o = (v2f_mksky)0;
o.wnormal = UnityObjectToWorldNormal(v.normal);
o.wpos = mul(unity_ObjectToWorld, v.vertex);
o.pos = UnityObjectToClipPos(v.vertex );
return o;
}
float4 frag_mksky(v2f_mksky i) : COLOR
{
float3 V = GBNormalizeSafe(_WorldSpaceCameraPos.xyz - i.wpos.xyz);
float3 N = GBNormalizeSafe(i.wnormal);;
float3 R = reflect( -V, N );
float3 L = GBNormalizeSafe(_WorldSpaceLightPos0.xyz);
//Y轴
float3 Y = float3(0,-1,0);
//视线与Y轴的夹角
float VdY = dot(V,Y);
//光线与视线的夹角
float LdV = max(0,dot(-L,V));
float SunAreaA = 1 - _SunRadiusA * _SunRadiusA * 0.09;
float SunAreaB = 1 - _SunRadiusB * _SunRadiusB * 0.05;
//天空和地面颜色
float3 color0 = lerp(_SkyColor.rgb,_GroundColor.rgb,pow((1.0 - max(0,VdY)),_Horion1Size));
//天空和地面连接色
float3 color1 = lerp(color0,_HorizonColor.rgb,pow((1.0 - abs(VdY)),_Horizon2Size));
//天空顶颜色
float3 color3 = lerp(color1,_SkyupColor.rgb,saturate(2.5*VdY - 1.5668));
//太阳的范围
float3 sunColor = _SunColor * pow(saturate(1 - (LdV - SunAreaA) / (SunAreaB - SunAreaA)),5.0) * _SunIntensity;
//云彩
float4 cloudColor = texCUBE(_CloudsCube,R);
float3 emissive = lerp((color3 + sunColor),cloudColor.rgb,cloudColor.a);
float3 finalColor = emissive;
return fixed4(finalColor,0);
}
ENDCG
SubShader
{
Pass
{ //为场景中的美术制作的天空盒子做处理
Name "SKYBOX"
Tags { "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert_skybox
#pragma fragment frag_skybox
#pragma fragmentoption ARB_precision_hint_fastest
#pragma multi_compile _GONBEST_COLOR_MULTIPLIER_ON
#pragma multi_compile _GONBEST_HEIGHT_FOG_ON _GONBEST_HEIGHT_FOG_OFF
#pragma multi_compile _GONBEST_SPEC_ALPHA_ON
ENDCG
}
Pass
{ //为场景中的美术制作的天空盒子做处理
Name "SKYBOX&ALPHA"
Tags { "LightMode" = "ForwardBase" }
Blend SrcAlpha OneMinusSrcAlpha,Zero OneMinusSrcAlpha
ZWrite off
CGPROGRAM
#pragma vertex vert_skybox
#pragma fragment frag_skybox
#pragma fragmentoption ARB_precision_hint_fastest
#pragma multi_compile _GONBEST_COLOR_MULTIPLIER_ON
#pragma multi_compile _GONBEST_HEIGHT_FOG_ON _GONBEST_HEIGHT_FOG_OFF
ENDCG
}
Pass
{ //为场景中的美术制作的天空盒子做处理 -- 不带高度物
Name "SKYBOX&NOHEIGHTFOG"
Tags { "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert_skybox
#pragma fragment frag_skybox
#pragma fragmentoption ARB_precision_hint_fastest
#pragma multi_compile _GONBEST_COLOR_MULTIPLIER_ON
#pragma multi_compile _GONBEST_SPEC_ALPHA_ON
ENDCG
}
Pass
{ //为场景中的美术制作的天空盒子做处理 -- 不带高度物
Name "SKYBOX&ALPHA&NOHEIGHTFOG"
Tags { "LightMode" = "ForwardBase" }
Blend SrcAlpha OneMinusSrcAlpha,Zero OneMinusSrcAlpha
ZWrite off
CGPROGRAM
#pragma vertex vert_skybox
#pragma fragment frag_skybox
#pragma fragmentoption ARB_precision_hint_fastest
#pragma multi_compile _GONBEST_COLOR_MULTIPLIER_ON
ENDCG
}
Pass
{ //为场景中的美术制作的天空盒子做处理
Name "SKYBOX&CUBE"
Tags { "LightMode" = "ForwardBase" }
CGPROGRAM
#pragma vertex vert_mksky
#pragma fragment frag_mksky
#pragma fragmentoption ARB_precision_hint_fastest
#pragma multi_compile _GONBEST_SPEC_ALPHA_ON
ENDCG
}
}
}