Unity ShaderLab 소개
이 문서는 ShaderLab에 대한 개요와 기본적인 사용법을 설명합니다. ShaderLab은 Unity에서 셰이더를 정의하는 데 사용되는 선언적 언어로, 주로 그래픽스에 관련된 스크립팅 작업에 사용됩니다.
ShaderLab의 기능
ShaderLab에서는 다음과 같은 주요 기능을 지원합니다:
- 셰이더 오브젝트 구조 정의
셰이더의 전반적인 구조를 설정합니다. - HLSL로 작성된 셰이더 프로그램 추가
HLSL 코드를 코드 블록으로 추가할 수 있습니다. - GPU의 렌더 상태 설정
셰이더 프로그램 실행 전에 GPU의 렌더 상태를 설정할 수 있습니다. - 머티리얼 프로퍼티 정의
셰이더 코드의 프로퍼티를 노출하여 머티리얼 인스펙터에서 수정 가능하게 합니다. - 패키지 요구 사항 지정
특정 패키지가 설치된 경우에만 서브셰이더와 패스를 실행하도록 지정합니다. - 폴백 행동 정의
현재 하드웨어에서 사용할 수 있는 서브셰이더가 없는 경우의 행동을 정의합니다.
ShaderLab 기본 구조
ShaderLab의 기본 구조는 다음과 같습니다:
Shader "ShaderName"
{
Properties
{
// 머티리얼 속성 정의
}
SubShader
{
Tags { "RenderType"="Opaque" }
Pass
{
// HLSL 코드
}
}
}
Properties 블록
셰이더의 속성을 정의하는 부분입니다. 머티리얼 인스펙터에서 사용자가 수정할 수 있는 속성들을 포함합니다.
SubShader 블록
셰이더의 메인 로직을 포함하며, 여러 개의 서브셰이더를 정의할 수 있습니다. 각 서브셰이더는 렌더링 방법 및 상태를 정의합니다.
Pass 블록
각 서브셰이더에 포함된 렌더링 패스를 정의합니다. HLSL 코드를 포함하여, 어떤 방식으로 렌더링될지를 결정합니다.
ShaderLab의 사용 예제
다양한 유형의 셰이더를 만들 때 ShaderLab을 활용하는 일을 통해 더 많은 가능성을 발견할 수 있습니다.
기본 셰이더 예제
단순한 기본 셰이더를 작성하여 물체의 색상을 조절할 수 있습니다.
Shader "Custom/BasicColorShader"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
}
SubShader
{
Pass
{
CGPROGRAM
#include "UnityCG.cginc"
struct appdata_t
{
float4 vertex : POSITION;
float4 color : COLOR;
};
struct v2f
{
float4 pos : SV_POSITION;
float4 color : COLOR;
};
fixed4 _Color;
v2f vert(appdata_t v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.color = v.color * _Color;
return o;
}
ENDCG
}
}
}
복잡한 셰이더 예제
입체감을 더하기 위해 노말 맵을 사용하는 예제입니다.
Shader "Custom/BumpMappedShader"
{
Properties
{
_MainTex ("Main Texture", 2D) = "white" {}
_Bump ("Normal Map", 2D) = "bump" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
sampler2D _Bump;
float4 _MainTex_ST;
struct appdata_t
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 pos : SV_POSITION;
};
v2f vert(appdata_t v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
}
결론
ShaderLab은 Unity에서 셰이더를 작성하고 관리하는 데 필수적인 도구입니다. 여러 기능을 적절히 활용하여 시각적으로 매력적인 그래픽스를 구현할 수 있습니다. ShaderLab에 대한 이해가 깊어질수록 더욱 창의적이고 복잡한 셰이더를 생성할 수 있는 능력이 향상됩니다.