반응형
이전 글에서는 Unity 쉐이더의 기본 개념과 Surface 쉐이더의 구성 요소를 살펴보았습니다. 이번 글에서는 쉐이더 코드를 직접 분석하며 쉐이더 작동 방식을 이해하는 데 집중할 것입니다.
1. CGPROGRAM & ENDCG
쉐이더 코드는 CGPROGRAM과 ENDCG 키워드 사이에 작성됩니다. 이는 Cg 또는 HLSL과 같은 프로그래밍 언어를 사용하여 쉐이더를 구현한다는 것을 의미합니다. Cg는 NVIDIA에서 개발한 고수준 쉐이더 언어이며, HLSL은 Microsoft에서 개발한 고수준 쉐이더 언어입니다. Unity는 Cg와 HLSL 모두를 지원하며, 쉐이더 모델 3.0 이상을 사용할 수 있습니다.
2. #pragma
#pragma는 쉐이더 컴파일러에게 특정 지침을 제공하는 키워드입니다. 컴파일러는 이러한 지침을 사용하여 쉐이더 코드를 특정 GPU 아키텍처에 맞게 최적화합니다.
- #pragma surface: 렌더링 방식을 정의합니다. 예를 들어, #pragma surface surf Standard fullforwardshadows는 표면 쉐이더이며, 표준 조명 모델을 사용하고 그림자를 계산한다는 것을 의미합니다.
- #pragma target: 쉐이더를 지원하는 GPU 버전을 정의합니다. 예를 들어, #pragma target 3.0은 Shader Model 3.0 이상을 지원하는 GPU에서만 쉐이더가 작동한다는 것을 의미합니다.
- #pragma multi_compile: 여러 쉐이더 변형을 생성합니다. 예를 들어, #pragma multi_compile _ _MAIN_TEX는 _MAIN_TEX 프로퍼티가 있는 경우와 없는 경우 두 개의 쉐이더 변형을 생성합니다.
3. 빨간색 공 생성 및 그림자 연산
다음 코드는 Albedo를 사용하여 빨간색 공을 생성하고 그림자를 연산하는 예시입니다.
Shader "MyShader"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
_Metallic ("Metallic", Range(0,1)) = 0.0
_Smoothness ("Smoothness", Range(0,1)) = 0.5
_Glossiness ("Glossiness", Range(0,1)) = 0.5
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Standard fullforwardshadows
#pragma target 3.0
sampler2D _MainTex;
struct Input
{
float2 uv_MainTex;
};
half _Glossiness;
void surf (Input IN, inout SurfaceOutputStandard o)
{
o.Albedo = float3(1, 0, 0);
o.Metallic = _Glossiness;
o.Smoothness = _Glossiness;
}
ENDCG
}
}
4. Emission
Emission은 빛을 방출하는 표면의 특성을 정의합니다. 다음 코드는 Emission을 사용하여 밤에 빛나는 공을 만드는 예시입니다.
void surf (Input IN, inout SurfaceOutputStandard o)
{
// ...
o.Emission = float3(1, 0, 0);
}
5. Swizzling 기법
Swizzling은 컴포넌트 순서를 변경하거나 특정 컴포넌트만 추출하는 데 사용되는 쉐이더 프로그래밍 기법입니다. 텍스처 좌표, 컬러 벡터, 법선 벡터 등 다양한 데이터에 적용할 수 있습니다. Swizzling은 코드 간결성을 높이고 성능을 향상시키는 데 도움이 됩니다.
void surf (Input IN, inout SurfaceOutputStandard o)
{
float3 R = float3(1, 0, 0);
o.Emission = R.grb;
}
R.grb은 Swizzling 기법을 사용하여 R 벡터의 컴포넌트 순서를 변경합니다.
- g: 초록색 컴포넌트 (1)을 선택합니다.
- r: 빨간색 컴포넌트 (0)은 선택하지 않습니다.
- b: 파란색 컴포넌트 (0)은 선택하지 않습니다.
6. 텍스처 좌표 계산
텍스처 좌표는 텍스처에서 픽셀 값을 샘플링하는 데 사용됩니다. Unity는 다양한 텍스처 좌표 계산 방식을 제공합니다.
- UV 좌표: 기본적인 텍스처 좌표 계산 방식입니다.
- World Space 좌표: 3D 공간에서 텍스처 좌표를 계산합니다.
- Object Space 좌표: 오브젝트 공간에서 텍스처 좌표를 계산합니다.
7. 조명 계산
Unity는 표준 조명 모델, 표면 쉐이더, 그림자 등 다양한 조명 기능을 제공합니다.
- 표준 조명 모델: Phong 조명 모델을 기반으로 한 기본적인 조명 모델입니다.
- 표면 쉐이더: 표면 쉐이더는 조명 계산을 위한 코드를 직접 작성할 수 있습니다.
- 그림자: 그림자를 사용하여 렌더링에 사실적인 효과를 추가할 수 있습니다.
'Unity' 카테고리의 다른 글
Unity Shader : 텍스쳐 입히기와 UV 좌표 활용 (0) | 2024.03.16 |
---|---|
Unity Light : 조명 (0) | 2024.03.15 |
Unity Shader : 기초 (0) | 2024.03.13 |
RigidbodyConstraints : 회전과 위치 제어 (0) | 2024.03.09 |
Rigidbody에서 오브젝트에 힘을 가할 때 사용되는 ForceMode (0) | 2024.02.21 |