Unity/Shader & VFX
Unity Shader Properties 응용 & multi_compile
CatDarkGame
2019. 12. 29. 22:17
반응형
쉐이더 작성시 Properties 인터페이스를 다양하게 응용할 수 있습니다.
마테리얼 이용자가 보기 편하게 구성하거나 [Enum] & multi_compile구문을 통해 사전 컴파일 기능을 만들 수 있습니다.
(사전 컴파일 : 1개의 쉐이더 파일에서 여러 기능을 사용 할 수 있도록 런타임 전에 설정 할 수 있는 옵션)
위 기능을 이용해 블랜드 옵션을 설정하여 Additive나 Alpha Blended설정을 쉐이더 코드 수정없이 조정이 가능하게 만들수 있습니다.
Shader "JH/Sh_Sample"
{
Properties
{
[Header(_______________________)]
[Header(Texture)]
_MainTex ("Texture", 2D) = "white" {}
[Space(20)]
[Header(__________________________)]
[Header(Cull)]
[Enum(UnityEngine.Rendering.CullMode)] _Cull("Cull", Float) = 0
[Space(20)]
[Header(________________)]
[Header(ZTest ZWrite)]
[Enum(UnityEngine.Rendering.CompareFunction)] _ZTest("ZTest", Float) = 4
[Enum(Off, 0, On, 1)] _ZWrite("ZWrite", Float) = 0
[Space(20)]
[Header(_________________________)]
[Header(Blend)]
[Enum(UnityEngine.Rendering.BlendMode)] _SrcFactor("Src Factor", Float) = 5
[Enum(UnityEngine.Rendering.BlendMode)] _DstFactor("Dst Factor", Float) = 10
[Space(20)]
[Header(__________________________________)]
[Header(multicomplie_GrayMask)]
[Toggle]_USEGRAYMASK("GrayMask(흑백마스크)", float) = 0
[Space(20)]
[Header(_______________________________________)]
[KeywordEnum(None, Add, Multiply)] _Overlay("Overlay mode", Float) = 0
[Enum(One,1,SrcAlpha,5)] _Blend2("Blend mode subset", Float) = 1
[IntRange] _Alpha("Alpha", Range(0, 255)) = 100
[PowerSlider(3.0)] _Shininess("Shininess", Range(0.01, 1)) = 0.08
[Space(20)]
[Header(___________________________________________)]
[Normal] _BumpTex("Normal Map", 2D) = "bump" {}
[HideInInspector] _SpecularHighlights("Specular Highlights", Float) = 1.0
}
SubShader
{
Tags {"Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent"}
Cull[_Cull]
ZTest[_ZTest]
ZWrite[_ZWrite]
Blend[_SrcFactor][_DstFactor]
LOD 100
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile _USEGRAYMASK_OFF _USEGRAYMASK_ON
#pragma multi_compile _OVERLAY_NONE _OVERLAY_ADD _OVERLAY_MULTIPLY
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
float4 _MainTex_ST;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
#if _OVERLAY_ADD
col.rgb = dot(col.rgb, float3(0.333f, 0.333f, 0.333f));
#elif _USEGRAYMASK_OFF
#endif
return col;
}
ENDCG
}
}
}
반응형