셰이더란?
셰이더(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 범위로 지정합니다.
지원되는 속성 타입
| 타입 | 설명 |
|---|---|
| Color | RGBA 색상 값 |
| Vector | 4개의 실수로 구성된 벡터 (x,y,z,w) |
| Float | 단일 실수 값 |
| Range(min, max) | 지정된 범위 내 실수 (슬라이더로 표현됨) |
| 2D | 2차원 텍스처 맵핑 |
| Cube | 큐브맵(Cubemap), 주로 반사 효과용 |
| 3D | 3D 볼륨 텍스처 |
텍스처 속성의 경우, 초기값으로
"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는 무시됩니다.