unity skill indicator shader
Unity3D 2020. 11. 24. 18:04반응형
Shader "taecg/SkillIndicator/Arrow"
{
Properties
{
_Color("Color",color) = (1,1,1,1)
_MainTex ("Texture", 2D) = "white" {}
_Intensity("Intensity", float) = 1
[Header(Flow)]
_FlowColor("Flow Color",color) = (1,1,1,1)
_Duration ("Duration",range(0,1)) = 0
[Space]
[Header(Blend)]
[Enum(UnityEngine.Rendering.BlendMode)] _SrcBlend("Src Blend Mode", Float) = 1
[Enum(UnityEngine.Rendering.BlendMode)] _DstBlend("Dst Blend Mode", Float) = 1
}
SubShader
{
Tags { "Queue" = "Transparent" "RenderType"="Transparent" "RenderPipeline" = "UniversalPipeline" }
Pass
{
Blend [_SrcBlend] [_DstBlend]
ZWrite Off
Name "Unlit"
HLSLPROGRAM
// Required to compile gles 2.0 with standard srp library
#pragma prefer_hlslcc gles
#pragma exclude_renderers d3d11_9x
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"
struct Attributes
{
float4 positionOS : POSITION;
float2 uv : TEXCOORD0;
};
struct Varyings
{
float4 positionCS : SV_POSITION;
float2 uv : TEXCOORD0;
float2 uv_mask : TEXCOORD1;
float2 uv_flow : TEXCOORD2;
float fogCoord : TEXCOORD3;
};
CBUFFER_START(UnityPerMaterial)
half4 _Color;
half _Intensity;
half4 _FlowColor;
half _Duration;
CBUFFER_END
TEXTURE2D (_MainTex);SAMPLER(sampler_MainTex);float4 _MainTex_ST;
// #define smp _linear_clampU_mirrorV
// SAMPLER(smp);
Varyings vert(Attributes v)
{
Varyings o = (Varyings)0;
o.positionCS = TransformObjectToHClip(v.positionOS.xyz);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.uv_mask = v.uv;
o.uv_flow = float2(v.uv.x, v.uv.y + (1 - _Duration));
o.fogCoord = ComputeFogFactor(o.positionCS.z);
return o;
}
half4 frag(Varyings i) : SV_Target
{
//尾部透明遮罩
half mask = smoothstep(0, 0.3, i.uv_mask.y);
half2 uv = i.uv;
//主纹理
half4 mainTex = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv);
half4 mainCol = mainTex.r * mask* _Color * _Intensity;
//扫光
half4 flow = 0;
half4 flowTex = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, i.uv_flow);
flow = flowTex.g * mainTex.b * mask* _FlowColor;
half4 col = mainCol + flow;
// col.rgb = MixFog(col.rgb, i.fogCoord);
return col;
}
ENDHLSL
}
}
SubShader
{
Tags {"Queue" = "Transparent" "RenderType"="Transparent" }
Blend [_SrcBlend] [_DstBlend]
ZWrite Off
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
float2 uv : TEXCOORD0;
float2 uv_mask: TEXCOORD1;
float2 uv_flow: TEXCOORD2;
};
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _Color;
fixed _Intensity;
fixed4 _FlowColor;
fixed _Duration;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw;
o.uv_mask = v.uv;
o.uv_flow = float2(v.uv.x, v.uv.y + (1-_Duration));
return o;
}
fixed4 frag (v2f i) : SV_Target
{
//尾部透明遮罩
fixed mask = smoothstep(0, 0.3, i.uv_mask.y);
half2 uv = i.uv;
//主纹理
fixed4 mainTex = tex2D(_MainTex, uv);
fixed4 mainCol = mainTex.r * mask* _Color * _Intensity;
//扫光
fixed4 flow = 0;
fixed4 flowTex = tex2D(_MainTex, i.uv_flow);
flow = flowTex.g * mainTex.b * mask* _FlowColor;
fixed4 col = mainCol + flow;
return col;
}
ENDCG
}
}
}
반응형
'Unity3D' 카테고리의 다른 글
외적 활용 (좌우 알아내기, 문의 앞뒤 알아내기) (0) | 2020.11.25 |
---|---|
유도탄 (내적 + 외적) (0) | 2020.11.25 |
Vector3.Dot (내적) (0) | 2020.11.24 |
TransformDirection, InverseTransformDirection, TransformPoint, InverseTransformPoint (0) | 2020.11.24 |
Cinemachine Camera (0) | 2020.11.19 |