116 lines
3.7 KiB
Plaintext
116 lines
3.7 KiB
Plaintext
Shader "LeEthER/GradientFlowEmission"
|
|
{
|
|
Properties
|
|
{
|
|
[MainTexture] _BaseMap("Base Map", 2D) = "white" {}
|
|
[MainColor] _BaseColor("Base Color", Color) = (1,1,1,1)
|
|
|
|
_EmissionMask("Emission Mask", 2D) = "white" {}
|
|
[HDR] _EmissionColorA("Emission Color A", Color) = (0, 0.8, 1, 1)
|
|
[HDR] _EmissionColorB("Emission Color B", Color) = (1, 0.2, 0.8, 1)
|
|
_EmissionIntensity("Emission Intensity", Range(0, 10)) = 1.5
|
|
|
|
_FlowDirection("Flow Direction", Vector) = (1, 0, 0, 0)
|
|
_FlowSpeed("Flow Speed", Range(-5, 5)) = 1
|
|
_FlowScale("Flow Scale", Range(0.1, 20)) = 3
|
|
_FlowSharpness("Flow Sharpness", Range(0.1, 10)) = 2
|
|
_FlowContrast("Flow Contrast", Range(0.1, 5)) = 1
|
|
|
|
_EmissionPulse("Emission Pulse", Range(0, 1)) = 0.25
|
|
}
|
|
|
|
SubShader
|
|
{
|
|
Tags
|
|
{
|
|
"RenderType"="Opaque"
|
|
"RenderPipeline"="UniversalPipeline"
|
|
"Queue"="Geometry"
|
|
}
|
|
|
|
Pass
|
|
{
|
|
Name "ForwardUnlit"
|
|
Tags { "LightMode"="UniversalForward" }
|
|
|
|
HLSLPROGRAM
|
|
#pragma vertex vert
|
|
#pragma fragment frag
|
|
|
|
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
|
|
|
|
struct Attributes
|
|
{
|
|
float4 positionOS : POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
};
|
|
|
|
struct Varyings
|
|
{
|
|
float4 positionHCS : SV_POSITION;
|
|
float2 uv : TEXCOORD0;
|
|
};
|
|
|
|
TEXTURE2D(_BaseMap);
|
|
SAMPLER(sampler_BaseMap);
|
|
|
|
TEXTURE2D(_EmissionMask);
|
|
SAMPLER(sampler_EmissionMask);
|
|
|
|
CBUFFER_START(UnityPerMaterial)
|
|
float4 _BaseMap_ST;
|
|
float4 _EmissionMask_ST;
|
|
float4 _BaseColor;
|
|
float4 _EmissionColorA;
|
|
float4 _EmissionColorB;
|
|
float4 _FlowDirection;
|
|
float _EmissionIntensity;
|
|
float _FlowSpeed;
|
|
float _FlowScale;
|
|
float _FlowSharpness;
|
|
float _FlowContrast;
|
|
float _EmissionPulse;
|
|
CBUFFER_END
|
|
|
|
Varyings vert(Attributes IN)
|
|
{
|
|
Varyings OUT;
|
|
OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
|
|
OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);
|
|
return OUT;
|
|
}
|
|
|
|
half4 frag(Varyings IN) : SV_Target
|
|
{
|
|
float2 uv = IN.uv;
|
|
|
|
half4 baseCol = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, uv) * _BaseColor;
|
|
half emissionMask = SAMPLE_TEXTURE2D(_EmissionMask, sampler_EmissionMask, uv).r;
|
|
|
|
float2 dir = _FlowDirection.xy;
|
|
dir = length(dir) > 0.0001 ? normalize(dir) : float2(1, 0);
|
|
|
|
// 방향을 따라 흐르는 값
|
|
float flowCoord = dot(uv, dir) * _FlowScale + _Time.y * _FlowSpeed;
|
|
|
|
// 0~1 반복되는 부드러운 웨이브
|
|
float wave = sin(flowCoord * 6.2831853) * 0.5 + 0.5;
|
|
|
|
// 명암 대비 조절
|
|
wave = pow(saturate(wave), _FlowSharpness);
|
|
wave = saturate((wave - 0.5) * _FlowContrast + 0.5);
|
|
|
|
// 추가로 밝기 맥동
|
|
float pulse = lerp(1.0, wave, _EmissionPulse);
|
|
|
|
// A -> B 그라데이션
|
|
half3 emissionGradient = lerp(_EmissionColorA.rgb, _EmissionColorB.rgb, wave);
|
|
|
|
half3 emission = emissionGradient * emissionMask * _EmissionIntensity * pulse;
|
|
|
|
return half4(baseCol.rgb + emission, baseCol.a);
|
|
}
|
|
ENDHLSL
|
|
}
|
|
}
|
|
} |