Posts 유니티 쉐이더 프로퍼티 애트리뷰트 모음
Post
Cancel

유니티 쉐이더 프로퍼티 애트리뷰트 모음

Space


1
[Space(10)]
  • 단순 공백을 크기로 지정한다.


Header


1
[Header(Header Text)]
  • 헤더 문자열을 지정한다.
  • 큰따옴표로 묶지 않아야 한다.


Toggle


1
[Toggle] _MyToggle ("My Toggle", Float) = 1.0
  • 체크할 경우 1.0, 체크 해제할 경우 0.0으로 값을 받을 수 있다.


IntRange


1
[IntRange] _Value("Value", Range(0, 100)) = 50
  • Range를 정수로 지정할 수 있게 한다.


PowerSlider


1
[PowerSlider(3.0)] _Pow("Power", Range(0.01, 1)) = 0.01
  • 지수 슬라이더를 만든다.


Enum


1
2
3
4
5
6
[Enum(UnityEngine.Rendering.CullMode)]     _CullMode("Cull Mode", Float) = 2
[Enum(UnityEngine.Rendering.CompareFunction)] _ZTest("Z Test", Float) = 0
[Enum(Off, 0, On, 1)] _ZWrite("ZWrite", Float) = 1

[Enum(UnityEngine.Rendering.BlendMode)] _SrcFactor("Src Factor", Float) = 5
[Enum(UnityEngine.Rendering.BlendMode)] _DstFactor("Dst Factor", Float) = 10
  • 이미 정의된 Enum을 타입으로 지정하여 가져올 수 있으며,
  • 괄호 내에서 직접 Enum을 넣어줄 수도 있다.
  • 이렇게 지정한 Enum은 쉐이더 키워드에서 활용할 수 있다.


Shader Feature, Multi Compile


공통점

  • 전처리기 지시문 if를 통해 분기할 수 있다.

차이점

  • Shader Feature는 사용되지 않는 배리언트가 빌드에 포함되지 않아, 마테리얼의 키워드 설정에 적합하다.
  • Multi Compile은 프로젝트 내 전역으로 설정되는 키워드로 사용하기에 적합하다.

대상

  • [Toggle(TOGGLE_NAME)], [KeywordEnum(A, B, C)]


Toggle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Properties
{
    [Toggle(BRIGHTER)] _Brighter("Brighter", Float) = 0
}
SubShader
{
    // ..

    CGPROGRAM

    #pragma shader_feature BRIGHTER

    // ..

    void surf (Input IN, inout SurfaceOutputStandard o)
    {
        fixed4 c = _Color;

    #ifdef BRIGHTER
        c.rgb *= 2.0;
    #endif

        o.Albedo = c.rgb;
        o.Alpha = c.a;
    }
    ENDCG
}
  • Toggle 괄호 내부에 키워드를 지정한다.
  • #pragma shader_feature로 키워드를 그대로 선언한다.
  • 전처리 지시문 #ifdef ~ #else ~ #endif로 활용할 수 있다.


KeywordEnum

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Properties
{
    [KeywordEnum(None, Red, Green, Blue)] _ColorOverwrite("Color Overwrite", Float) = 0
}
SubShader
{
    // ...

    CGPROGRAM

    #pragma shader_feature _COLOROVERWRITE_NONE _COLOROVERWRITE_RED _COLOROVERWRITE_GREEN _COLOROVERWRITE_BLUE

    // ...

    void surf (Input IN, inout SurfaceOutputStandard o)
    {
        fixed4 c = _Color;

    #if _COLOROVERWRITE_RED
        c.rgb = fixed3(1., 0., 0.);
            
    #elif _COLOROVERWRITE_GREEN
        c.rgb = fixed3(0., 1., 0.);
            
    #elif _COLOROVERWRITE_BLUE
        c.rgb = fixed3(0., 0., 1.);

    #endif

        o.Albedo = c.rgb;
        o.Alpha = c.a;
    }
    ENDCG
}
  • KeywordEnum 괄호 내부에 Enum 값들을 직접 정의한다.
  • 정수 값은 0부터 시작한다.

  • #pragma shader_feature Enum 값마다 프로퍼티명_값 꼴로 모두 작성해준다.
  • pragma는 enum 하나 당 한줄로 작성해야 하며, 프로퍼티를 소문자로 선언했더라도 모두 대문자로 작성해야 한다.
  • 전처리 지시문 #if ~ #elif ~ #endif로 활용할 수 있다.


Example Source Code


Source Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
Shader "Custom/ShaderOptionsExample"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)

        [Space(5)]
        [Header(___________________________________________________________)]
        [Header(Attributes)]

        [Toggle] _MyToggle ("My Toggle", Float) = 1.0
        [IntRange] _IntRange ("Int Range", Range(0, 100)) = 50
        [PowerSlider(3.0)] _Pow ("Power", Range(0.01, 1)) = 0.01

        [Space(5)]
        [Header(___________________________________________________________)]
        [Header(Enums)]

        [Enum(UnityEngine.Rendering.CullMode)] _CullMode("Cull Mode", Float) = 2
        [Enum(UnityEngine.Rendering.CompareFunction)] _ZTest("Z Test", Float) = 0
        [Enum(Off, 0, On, 1)] _ZWrite("ZWrite", Float) = 1

        [Enum(UnityEngine.Rendering.BlendMode)] _SrcFactor("Src Factor", Float) = 5
        [Enum(UnityEngine.Rendering.BlendMode)] _DstFactor("Dst Factor", Float) = 10

        [Space(5)]
        [Header(___________________________________________________________)]
        [Header(Variants)]

        [Toggle(BRIGHTER)] _Brighter("Brighter", Float) = 0
        [KeywordEnum(None, Red, Green, Blue)] _ColorOverwrite("Color Overwrite", Float) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Transparent" "Queue"="Transparent"}

        Cull   [_CullMode]
        ZTest  [_ZTest]
        ZWrite [_ZWrite]
        Blend  [_SrcFactor] [_DstFactor]

        CGPROGRAM

        #pragma shader_feature BRIGHTER
        #pragma shader_feature _COLOROVERWRITE_NONE _COLOROVERWRITE_RED _COLOROVERWRITE_GREEN _COLOROVERWRITE_BLUE

        #pragma surface surf Standard keepalpha //addshadow

        struct Input { fixed color:COLOR; };

        fixed4 _Color;
        float _MyToggle;

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 c = _Color;

        #if _COLOROVERWRITE_RED
            c.rgb = fixed3(1., 0., 0.);
            
        #elif _COLOROVERWRITE_GREEN
            c.rgb = fixed3(0., 1., 0.);
            
        #elif _COLOROVERWRITE_BLUE
            c.rgb = fixed3(0., 0., 1.);

        #endif

        #ifdef BRIGHTER
            c.rgb *= 2.0;
        #else
        #endif

            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Transparent"
}


References


This post is licensed under CC BY 4.0 by the author.