115 lines
3.1 KiB
HLSL
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_ |