Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
05-16 04:51
관리 메뉴

nomad-programmer

[CG/Unity] 유니티 셰이더의 작성 방법 본문

CG/Unity

[CG/Unity] 유니티 셰이더의 작성 방법

scii 2021. 11. 14. 02:27

유니티 셰이더는 ShaderLab이라고 불리는 자체 스크립트 언어를 이용하고 있다. 스크립트는 일반적인 코딩과 약간 다른 방식으로 작성되며 문법도 약간 다르다.

굳이 이렇게 스크립트로 제작된 이유는 유니티의 특성과 사용자의 편의성 때문이다. 유니티는 멀티 플랫폼 제작이 자동으로 지원되는 엔진이다. 즉, 모바일이나 pc, 콘솔기기에 따라 제작되는 셰이더가 달라야 한다. 또한 셰이더는 글미자가 있을 때와 없을 때, 라이트맵이 있을 때와 없을 때 등 여러 가지 경우의 수에 따라 제작방법이 다르다.

다양한 경우의 수를 사용자가 제각각 작성하고 관리한다면 상당한 무리가 따를 수밖에 없다. 그래서 만들어진 유니티 내부의 셰이더 스크립트가 ShderLab이다. 이 스크립트를 사용하면 다양한 경우의 셰이더 분기를 자동으로 작성해줌으로써 사용자는 간단하게 이 스크립트의 문법에 맞춰 하나의 셰이더만 작성하면 된다. 

그리고 이 ShaderLab을 이용한 제작 방식은 크게 세 가지로 나뉘게 된다.

  1. ShaderLab으로 작성하는 방식
  2. Surface Shader로 작성하는 방식
  3. Vertex & Fragment Shader로 작성하는 방식

1. ShaderLab으로 작성하는 방식 (고정 파이프라인 셰이더: fixed function shader)

Shader "VertexLit" {
  Properties {
    _Color ("Main Color", Color) = (1,1,2,0.5)
    _SpecColor ("Spec Color", Color) = (1,1,1,1)
    _Emission ("Emissive Color", Color) = (0,0,0,0)
    _Shininess ("Shininess", Range (0.01, 1)) = 0.7
    _MainTex ("Base (RGB)", 2D) = "white" { }
 }
 
 SubShader {
   Pass {
     Material {
       Diffuse [_Color]
       Ambient [_Color]
       Shininess [_Shininess]
       Specular [_SpecColor]
       Emission [_Emission]
    }
    Lighting On
    SeparateSpecular On
    SetTexture [_MainTex] {
      constantColor [_Color]
      Combine texture * primary DOUBLE, texture * constant
    }
}

매우 가볍고 하드웨어 호환성이 좋지만, 기능이 상당히 부족하기 때문에 고급 효과를 기대하긴 어렵다. 

자체 문법으로 이루어져 있어서 다른 셰이더 문법과 거의 호환되지 않는 단점을 가지고 있다. 이 방식은 최근 거의 지원 중단 수순을 밝고 있기 때문에 추천하지 않는다.


2. Surface Shader로 작성하는 방식

Shader "Example/Diffuse Simple" {
  SubShader {
    Tags { "RenderType" = "Opaque" }
    CGPROGRAM
    #pragma surface surf Lambert
    struct Input {
      float4 color : COLOR;
    };
    void surf (Input IN, inout SurfaceOutput o) {
      o.Albedo = 1;
    }
    ENDCG
  }
  Fallback "Diffuse"
}

ShaderLab 스크립트와 함께 일부분은 CG 셰이더 코드를 사용하는 방법이다.

기본적인 조명 코드와 버텍스 셰이더의 복잡한 부분은 스크립트를 이용하여 자동으로 처리되고 있고, 픽셀 셰이더 부분만 간편하게 작성할 수도 있어서 편하다. 비주얼 셰이더 에디터와도 상당히 비슷한 개념을 가지고 있어서, 초보자가 공부하기에 좋고 응용하기에도 좋다.

단, 최적화에는 다소 무리가 있고, 일정 수준 이상의 고급 기법을 구현하기는 어려운 면도 있따.


3. Vertex & Fragment Shader로 작성하는 방식

Shader "Unlit/SingleColor"
{
  Properties
  {
    _Color ("Main Color", Color) = (1,1,1,1)
  }
  SubShader
  {
    Pass
    {
      CGPROGRAM
      #pragma vertex vert
      #pragma fragment frag
      
      // vertex shader
      float4 vert(float4 vertex : POSITION) : SV_POSITION
      {
        return mul(UNITY_MATRIX_MVP, vertex);
      }
      
      fixed4 _Color;
      
      // pixel shader
      fixed4 frag() : SV_Target
      {
        return _Color;
      }
      ENDCG
    }
  }
}

ShaderLab 스크립트와 함께 CG 셰이더 코드를 사용하지만, 좀 더 본격적인 셰이더 작성 방법이다. 자동으로 처리해주는 부분이 별로 없어서 제대로 된 CG 셰이더 방식으로 버텍스의 좌표 변환부터 제대로 처리해야 작동한다. 배우기는 조금 힘들지만, 완전히 수동으로 제어할 수 있어서 최적화와 고급 기법을 표현할 때 좋다.

'CG > Unity' 카테고리의 다른 글

[CG/Unity] Diffuse Warping  (0) 2022.02.01
[CG/Unity] Toon Shader  (0) 2022.02.01
[CG/Unity] Vertex Shader  (0) 2022.01.30
[CG/Unity] Lambert 셰이더  (0) 2022.01.16
[CG/Unity] Custom Light 만드는 방법  (0) 2022.01.15
Comments