Unity HLSL 셰이더 작성 가이드
이 문서는 Unity에서 HLSL(High-Level Shader Language)를 사용하여 셰이더 프로그램을 작성하는 방법에 대한 정보를 제공합니다. Unity의 HLSL 사용법은 Microsoft의 HLSL 문서에서도 확인할 수 있습니다.
기본 개념
- Unity는 HLSL 프로그래밍 언어를 사용하여 셰이더를 작성합니다.
- Unity는 과거에 Cg라는 언어를 사용했으며, 일부 키워드와 파일 확장자(.cginc)에서 "cg"라는 이름을 여전히 사용하고 있습니다.
- 현재 Cg는 더 이상 사용되지 않지만, 그 이름이 남아있습니다.
HLSL 코드 추가
ShaderLab 코드에 HLSL 코드를 추가하려면 다음과 같은 형식을 따릅니다:
Pass {
// ... 일반적인 패스 상태 설정 ...
HLSLPROGRAM
// 이 코드 조각의 컴파일 지시문 예:
#pragma vertex vert
#pragma fragment frag
// 셰이더 프로그램 본체
ENDHLSL
// ... 나머지 패스 ...
}
자세한 내용은 ShaderLab: 셰이더 프로그램 추가를 참조하세요.
HLSL 구문
HLSL에는 두 가지 주요 구문이 있습니다:
- 레거시 DirectX 9 스타일
sampler2D,tex2D()와 같은 함수 사용.- 모든 플랫폼에서 작동합니다.
- DirectX 10+ 스타일
Texture2D,SamplerState,.Sample()함수를 사용.- OpenGL에서는 텍스처와 샘플러가 서로 다른 오브젝트가 아니기 때문에 이 스타일의 일부 형태는 OpenGL 플랫폼에서 작동하지 않을 수 있습니다.
이러한 차이를 관리하기 위해 Unity는 프리 프로세서 매크로가 포함된 셰이더 라이브러리를 제공합니다. 더 많은 정보는 빌트인 셰이더 매크로 문서를 참조하세요.
예제
다음은 Unity에서 HLSL을 사용하여 간단한 셰이더 프로그램을 만드는 방법입니다.
예제 1: 기본 셰이더
Shader "Custom/SimpleShader"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
struct appdata_t
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
fixed4 _Color;
v2f vert (appdata_t v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = v.uv;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return _Color;
}
ENDHLSL
}
}
FallBack "Diffuse"
}
예제 2: 텍스처 사용 심화
셰이더에서 텍스처를 사용하는 방법에 대한 간단한 예제입니다.
Shader "Custom/TextureShader"
{
Properties
{
_MainTex ("Main Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
Pass
{
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
struct appdata_t
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
};
sampler2D _MainTex;
fixed4 _MainTex_ST;
v2f vert (appdata_t v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
return tex2D(_MainTex, i.uv);
}
ENDHLSL
}
}
FallBack "Diffuse"
}
결론
Unity에서 HLSL을 사용하여 셰이더를 작성하는 것은 게임 그래픽스를 향상시키는 강력한 방법입니다. 위의 예제와 설명을 참고하여 자신만의 셰이더를 만들고 실험해보세요. HLSL의 다양한 기능을 활용하여 몰입감 있는 비주얼을 구현할 수 있습니다.
추가적으로 Unity의 공식 문서도 참조하여 더욱 깊이 있는 지식을 쌓아보시기 바랍니다.