Unity 셰이더 기초: ShaderLab 문법 구조 이해

셰이더란?

셰이더(Shader)는 GPU에서 실행되는 프로그램으로, 그래픽 렌더링 과정에서 조명, 색상, 텍스처 등의 시각적 효과를 제어합니다. Unity에서는 사용자가 직접 쉐이더를 작성하여 물체의 외관을 세밀하게 조절할 수 있습니다.

ShaderLab이란?

Unity는 내부적으로 HLSL, GLSL, Cg와 같은 저수준 셰이딩 언어를 지원하지만, 개발자 친화적인 인터페이스를 제공하기 위해 자체적으로 ShaderLab이라는 고수준 스크립트 형식을 도입했습니다. 이 언어는 Cg/HLSL 코드를 래핑하며, 크로스 플랫폼 호환성을 보장합니다. 특히 Unity는 NVIDIA의 Cg 언어에 중점을 두어 작성된 셰이더를 주로 활용합니다.

기본 구조

모든 ShaderLab 스크립트는 다음 기본 틀을 따릅니다:

Shader "Shader/Name"
{
    Properties { }
    SubShader { }
}

Properties 블록: 유니티 인스펙터와 연결

이 섹션은 셰이더의 외부에서 조정 가능한 파라미터를 정의합니다.材质(Material) 에디터에서 노출되며, 실시간으로 값을 수정할 수 있습니다.

Properties
{
    _MainColor ("기본 색상", Color) = (1, 1, 1, 1)
    _Opacity ("투명도", Range(0.0, 1.0)) = 1.0
    _MainTex ("메인 텍스처", 2D) = "white" {}
    _ScaleFactor ("크기 계수", Float) = 1.0
    _Direction ("방향 벡터", Vector) = (0, 0, 1, 0)
}
  • _MainColor: 변수 이름입니다. 코드 내에서 참조할 때 사용됩니다.
  • "기본 색상": 인스펙터에 표시될 사용자 친화적 이름입니다.
  • Color: 데이터 타입으로, RGBA 구성의 색상을 의미합니다.
  • (1,1,1,1): 초기값입니다. 각각 R, G, B, A 채널을 0~1 범위로 지정합니다.

지원되는 속성 타입

타입설명
ColorRGBA 색상 값
Vector4개의 실수로 구성된 벡터 (x,y,z,w)
Float단일 실수 값
Range(min, max)지정된 범위 내 실수 (슬라이더로 표현됨)
2D2차원 텍스처 맵핑
Cube큐브맵(Cubemap), 주로 반사 효과용
3D3D 볼륨 텍스처

텍스처 속성의 경우, 초기값으로 "white", "black", "gray", 또는 "bump" 등을 사용할 수 있으며, 비어 있는 경우 ""로 설정 가능합니다. 옵션은 {} 안에 추가할 수 있습니다 (예: LinearRepeat 등).

SubShader: 실제 렌더링 로직

하나 이상의 SubShader를 포함할 수 있으며, 하드웨어 호환성에 따라 가장 적합한 하나가 선택됩니다. 각 서브셰이더는 여러 Pass로 구성됩니다.

SubShader
{
    Tags { "RenderType" = "Opaque" "Queue" = "Geometry" }
    LOD 200

    Pass
    {
        Material
        {
            Diffuse [_MainColor]
        }
        Lighting On
    }
}

태그(Tags): 렌더링 파이프라인 제어

태그는 Unity 엔진에게 이 셰이더가 어떤 컨텍스트에서 사용되어야 하는지를 알려줍니다.

  • "RenderType" = "Opaque": 불투명 오브젝트용. 반대로 "Transparent"는 알파 블렌딩이 필요한 경우 사용됩니다.
  • "Queue" = "Geometry": 렌더링 순서를 결정합니다.
    • Background (1000): 배경 요소 (예: 스카이박스)
    • Geometry (2000): 기본 불투명 객체
    • AlphaTest (2450): 알파 테스트 적용 객체
    • Transparent (3000): 투명 객체 (뒤에서 앞으로 정렬)
    • Overlay (4000): 최종 오버레이 효과
    사용자는 "Queue" = "Transparent+50"처럼 직접 오프셋을 지정할 수도 있습니다.
  • "IgnoreProjector" = "True": 프로젝터 영향을 받지 않음
  • "ForceNoShadowCasting" = "True": 그림자를 생성하지 않음

LOD (Level of Detail)

장치의 성능에 따라 특정 셰이더를 건너뛸 수 있도록 하는 설정입니다. 예를 들어 모바일 장비에서는 낮은 LOD만 활성화되도록 설정하면 성능 저하를 방지할 수 있습니다.

LOD 300

일반적인 기준값:

  • VertexLit: 100
  • Diffuse: 200
  • Bumped Specular: 400
  • Parallax Specular: 600

Quality Settings에서 최대 LOD를 지정하면, 그보다 높은 값의 SubShader는 무시됩니다.

태그: Unity ShaderLab Cg HLSL GPU Programming

6월 22일 01:59에 게시됨