Unity 표면 셰이더 가이드
이 가이드는 Unity의 표면 셰이더를 쉽게 이해하고 활용할 수 있도록 설명합니다. 표면 셰이더는 게임 오브젝트의 표현을 향상시키기 위해 사용됩니다. 다양한 조명 모델을 사용하여 아름답고 상호작용 가능한 렌더링 효과를 만드는 데 유용합니다.
표면 셰이더 기본 개념
- 표면 셰이더는 조명과 상호작용하는 셰이더를 더 쉽게 작성할 수 있게 해줍니다.
- 조명 모델은 오브젝트의 색상, 반사 및 조명 효과를 계산하는 방법을 정의합니다.
환경과 호환성
| 기능 이름 | 빌트인 렌더 파이프라인 | 유니버설 렌더 파이프라인(URP) | 고해상도 렌더 파이프라인(HDRP) | 커스텀 SRP |
|---|---|---|---|---|
| 표면 셰이더 | 지원 | 지원 안 함 | 지원 안 함 | 지원 안 함 |
간단한 셰이더 예제
기본 디퓨즈 셰이더
아주 단순한 디퓨즈 셰이더로 시작하겠습니다. 아래 코드는 표면 컬러를 "흰색"으로 설정합니다.
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"
}
텍스처 추가하기
위의 셰이더에 텍스처를 추가해 보겠습니다. 프로퍼티 블록을 사용하여 머티리얼에 텍스처 선택기를 둡니다.
Shader "Example/Diffuse Texture" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
struct Input {
float2 uv_MainTex;
};
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
}
ENDCG
}
Fallback "Diffuse"
}
다양한 셰이더 효과
노멀 매핑
노멀 매핑을 추가하여 물체의 표면을 더 실제감 있게 표현할 수 있습니다.
Shader "Example/Diffuse Bump" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
_BumpMap ("Bumpmap", 2D) = "bump" {}
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
struct Input {
float2 uv_MainTex;
float2 uv_BumpMap;
};
sampler2D _MainTex;
sampler2D _BumpMap;
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
}
ENDCG
}
Fallback "Diffuse"
}
림 라이트 추가하기
림 라이트를 추가하여 게임 오브젝트의 경계를 강조합니다.
Shader "Example/Rim" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
_BumpMap ("Bumpmap", 2D) = "bump" {}
_RimColor ("Rim Color", Color) = (0.26,0.19,0.16,0.0)
_RimPower ("Rim Power", Range(0.5,8.0)) = 3.0
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
struct Input {
float2 uv_MainTex;
float2 uv_BumpMap;
float3 viewDir;
};
sampler2D _MainTex;
sampler2D _BumpMap;
float4 _RimColor;
float _RimPower;
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
o.Normal = UnpackNormal (tex2D (_BumpMap, IN.uv_BumpMap));
half rim = 1.0 - saturate(dot (normalize(IN.viewDir), o.Normal));
o.Emission = _RimColor.rgb * pow (rim, _RimPower);
}
ENDCG
}
Fallback "Diffuse"
}
추가적인 활용 예제
- Detail Texture: 베이스 텍스처와 결합된 디테일 텍스처를 추가하여 더욱 풍부한 텍스처를 구현할 수 있습니다.
- 스크린 공간의 Detail Texture: 화면 좌표를 활용하여 추가적인 디테일을 적용하는 방법을 학습할 수 있습니다.
- 큐브맵 리플렉션: 환경 반사를 통해 현실감 있는 씬을 구현할 수 있습니다.
결론
표면 셰이더를 사용하여 다양한 시각 효과를 구현할 수 있습니다. 위의 예제들을 통해 자신만의 셰이더를 만들어 보세요. Unity의 셰이더 작성은 게임 개발에서 중요한 요소이므로 다양한 시도를 통해 숙련도를 높이는 것이 중요합니다.