miduo_client/Assets/ManagedResources/PublicArtRes/Shaders/Flame.cginc

115 lines
3.1 KiB
HLSL

#ifndef _FLAME_COMMON_CGINC_
#define _FLAME_COMMON_CGINC_
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
#ifdef _HASEXTENTDATA
float2 extent : TEXCOORD1;
#endif
};
struct v2f
{
float2 uv : TEXCOORD0;
float2 uv1 : TEXCOORD1;
UNITY_FOG_COORDS(2)
float4 vertex : SV_POSITION;
#ifndef _MOVEABLE
float offset : TEXCOORD3;
#endif
};
float4 _Scale;
v2f vert (appdata v)
{
v2f o;
#if defined(_HASEXTENTDATA)
float3 vWorldPos = v.vertex.xyz;
float4 vWorldViewPos = mul(UNITY_MATRIX_MV, float4(vWorldPos, 1));
vWorldViewPos.xy += (v.extent.xy - v.uv); // 生成面四个顶点重合,没有朝向概念
#elif defined(BUILD_IN_QUAD_MESH)
float2 vOffset = (v.uv - 0.5);
# ifdef _QUADFACE_TO_Z
float3 vWorldPos = v.vertex.xyz - float3(vOffset, 0);
# elif defined(_QUADFACE_TO_Y)
float3 vWorldPos = v.vertex.xyz - float3(vOffset.x, 0, vOffset.y);
# else
float3 vWorldPos = v.vertex.xyz - float3(0, vOffset);
# endif
float4 vWorldViewPos = mul(UNITY_MATRIX_MV, float4(vWorldPos, 1));
vWorldViewPos.xy += vOffset.xy * _Scale.xy;
// 这里渲染一个模型时,可以从矩阵中获得模型缩放大小
// 如果渲染多个模型会发生合批,这时顶点在传入前被变换,世界矩阵是单位阵,没有缩放信息
#else
float4 vScale = mul(unity_ObjectToWorld, float4(1, 1, 1, 1));
float4 vWorldPos = mul(unity_ObjectToWorld, float4(0, 0, 0, 1));
float4 vWorldViewPos = mul(UNITY_MATRIX_V, vWorldPos);
# ifdef _QUADFACE_TO_Z
vWorldViewPos.xy += v.vertex.xy * (vScale.xy - vWorldPos.xy);
# elif defined(_QUADFACE_TO_Y)
vWorldViewPos.xy += v.vertex.xz * (vScale.xz - vWorldPos.xz);
# else
vWorldViewPos.xy += v.vertex.yz * (vScale.yz - vWorldPos.yz);
# endif
#endif
o.vertex = mul(UNITY_MATRIX_P, vWorldViewPos);
o.uv1 = TRANSFORM_TEX(v.uv, _ChaosTex);
o.uv = v.uv;
#ifndef _MOVEABLE
o.offset = frac(vWorldPos.x * _RAND_A + vWorldPos.z * _RAND_B);
#endif
UNITY_TRANSFER_FOG(o, o.vertex);
return o;
}
void GetSL(float3 clr, out float s, out float l)
{
float a = min(min(clr.x, clr.y), clr.z);
float b = max(max(clr.x, clr.y), clr.z);
float delta = b - a;
l = (a + b) * 0.5;
s = (delta == 0.0) ? 0.0 : delta / (1.0 - abs(2.0 * l - 1.0));
}
void rgb2hsl(float4 clr, out float h, out float s, out float l)
{
float3 v1 = float3(-0.81649661, 0.40824831, 0.40824831);
float yy = clr.z * 0.70710677 - clr.y * 0.70710677;
float xx = dot(v1, clr.xyz);
h = xx == 0.0 ? 0.5 : (atan2(yy, xx) + UNITY_PI) * UNITY_INV_TWO_PI;
GetSL(clr.xyz, s, l);
}
float3 hsl2rgb(float h, float s, float l)
{
float th = (h + 0.5) * UNITY_TWO_PI;
float3 v3 = float3(cos(th), sin(th), 0);
float4 v4;
v4.x = dot(v3, float3(-0.81649655, 0.0, -0.57735026));
v4.y = dot(v3, float3(0.40824828, -0.70710677, -0.57735026));
v4.z = dot(v3, float3(0.40824828, 0.70710677, -0.57735026));
v4.w = 1.0;
float k = 0.5 - abs(0.5 - l);
float a = clamp(l - s * k, 0.0, 1.0);
float b = clamp(2.0 * s * k, 0.0, 1.0);
float _min = min(v4.x, min(v4.y, v4.z));
//float delta = b / (max(v4.x, max(v4.y, v4.z)) - _min);
float delta = (max(v4.x, max(v4.y, v4.z)) - _min);
delta = (delta == 0.0) ? 0.0 : b / delta;
return (v4.xyz - _min) * delta + a;
}
#endif // _FLAME_COMMON_CGINC_