유니티에서 사용하는 셰이더 언어는 ShaderLab 이라고 한다.

(공식 문서 - https://docs.unity3d.com/kr/current/Manual/SL-Shader.html)

(문법 정리 - http://chulin28ho.tistory.com/159)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// colored vertex lighting
Shader "Simple colored lighting"
{
    // a single color property
    Properties {
        _Color ("Main Color", Color) = (1,.5,.5,1)
    }
    // define one subshader
    SubShader
    {
        // a single pass in our subshader
        Pass
        {
            // use fixed function per-vertex lighting
            Material
            {
                Diffuse [_Color]
            }
            Lighting On
        }
    }
}
cs

기본틀은 위와 같다 




첫 줄은 셰이더의 이름을 지정하는 것으로 에디터상에서 아래처럼 나온다.

1
Shader "GameAcademy/SampleShader" {
cs




Properties 는 에디터의 머테리얼 인스펙터에서 파라미터 변수로 받아올 수 있는 부분이다.

1
2
3
4
5
6
Properties {
    _Color ("Color", Color) = (1,1,1,1)
    _MainTex ("Albedo (RGB)", 2D) = "white" {}
    _MainTex2("Albedo2 (RGB)", 2D) = "white" {}
    _NormalTex("Bumped (RGB)", 2D) = "white" {}
}
cs

_Color, _MainTex처럼 앞에 선언해주는 부분이 셰이더 내에서 변수이름이 되고

( 이후 첫번째 항목은 에디터에서 표시되는 라벨이름이다. "Color", "Albedo (RGB)"

두번째 항목은 자료형이라고 생각하면 된다. Color, 2D


위와 같이 선언하면 인스펙터에서는 아래와 같이 뜬다.



숫자는 Range(0, 1), Float, Int로 받을수 있으며

컬러 및 벡터는 Color, Vector

텍스쳐는 2D, Cube, 3D로 받을 수 있다.




SubShader 실제 셰이더 코드라고 생각하면 된다. 즉 구현부

SubShader는 여러개가 존재할 수 있으며 현재 그래픽카드(하드웨어)에서 실행 가능한 첫 서브셰이더를 선택한다.

1
2
3
4
5
6
7
8
9
10
11
12
SubShader{
    // A급 디바이스용. dx11용 이런식
}
SubShader{
    // B급 디바이스용. dx9용 이런식
}
SubShader{
    // C급
}
    
// 적용하는 셰이더를 지원하지않으면 FallBack으로
FallBack "Diffuse"
cs


FallBack사용 가능한 SubShader가 없을 경우 지정한 이름. 현재는 "Diffuse"라는 이름의 셰이더를 찾아 

거기서 SubShader를 찾아 실행한다.


Pass오브젝트의 렌더링 단위라고 생각하면 된다.

Posted by misty_
,