Unity 쉐이더는 게임 오브젝트의 렌더링 방식을 제어하는 코드입니다. 3D 그래픽에서 쉐이더는 매우 중요한 역할을 하며, 텍스처, 색상, 조명 등을 사용하여 사실적인 이미지를 만들 수 있도록 합니다.
1. 쉐이더 정의
쉐이더는 Cg 또는 HLSL과 같은 프로그래밍 언어로 작성된 코드이며, 꼭지점 셰이더와 프래그먼트 셰이더로 구성됩니다.
- 꼭지점 셰이더: 3D 공간에서 꼭지점의 위치를 변환하고 조명 계산을 수행합니다.
- 프래그먼트 셰이더: 각 픽셀의 색상을 계산합니다.
2. 쉐이더 종류
Unity에는 다양한 종류의 쉐이더가 있으며, 일반적으로 다음과 같이 분류됩니다.
- Standard Surface Shader: 대부분의 오브젝트에 사용되는 기본 쉐이더입니다.
- Lit Shader: 조명 계산을 수행하는 쉐이더입니다.
- Unlit Shader: 조명 계산을 수행하지 않고 텍스처만 표시하는 쉐이더입니다.
- Post-processing 쉐이더: 렌더링된 이미지에 효과를 추가하는 쉐이더입니다.
- Compute 쉐이더 : CPU에서 수행하던 계산을 GPU에서 수행하여 성능을 향상시키는 쉐이더입니다.
3. Surface Shader
Surface Shader는 Unity에서 가장 기본적인 쉐이더 유형입니다. 텍스처, 색상, 조명 등을 사용하여 오브젝트의 표면을 표현하는 데 사용됩니다. Surface Shader는 다음과 같은 주요 요소로 구성됩니다.
- Properties: 쉐이더에 사용되는 변수를 정의합니다. 예를 들어, 텍스처, 색상, 광택 등을 정의할 수 있습니다.
- SubShader: 렌더링 방식을 정의합니다. Surface Shader는 여러 SubShader를 가질 수 있으며, 각 SubShader는 다른 렌더링 옵션을 제공합니다.
- Pass: SubShader 내에서 렌더링 단계를 정의합니다. 각 Pass는 특정 조건에서 렌더링되는 방식을 정의합니다.
4. Properties
Properties는 쉐이더에서 사용되는 변수를 정의하는 데 사용됩니다. 텍스처, 색상, 숫자 등 다양한 유형의 데이터를 Properties로 정의할 수 있습니다.
Properties는 다음과 같은 요소로 구성됩니다.
- ShaderLab: 쉐이더 코드를 작성하는 언어를 선택합니다. (예: Surface Shader, Standard Shader)
- Tags: 렌더링 순서, 렌더링 방식 등을 정의하는 키워드 목록입니다.
- Keywords: 쉐이더 변형을 위한 키워드를 정의합니다.
- RenderQueue: 렌더링 순서를 정의합니다.
- LOD: Level of Detail. 오브젝트의 거리에 따라 렌더링 품질을 조절하는 설정입니다.
예를 들어, 텍스처를 Properties로 정의하려면 다음과 같이 코드를 작성합니다.
Properties {
_MainTex ("Albedo (RGB)", 2D) = "white" {}
}
이 코드는 "_MainTex"라는 이름의 텍스처 Property를 정의하며, 기본값은 "white" 텍스처입니다.
5. SubShader
SubShader는 렌더링 방식을 정의하는 데 사용됩니다. Surface Shader는 여러 SubShader를 가질 수 있으며, 각 SubShader는 다른 렌더링 옵션을 제공합니다.
SubShader는 다음과 같은 요소로 구성됩니다.
- Tags: 렌더링 순서, 렌더링 방식 등을 정의하는 키워드 목록입니다.
- LOD: Level of Detail. 오브젝트의 거리에 따라 렌더링 품질을 조절하는 설정입니다.
- Pass: SubShader 내에서 렌더링 단계를 정의합니다.
예를 들어, 불투명한 오브젝트를 렌더링하는 SubShader는 다음과 같이 코드를 작성합니다.
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
Pass
{
...
}
}
6. Pass
- Tags: Pass에 적용되는 조건을 정의하는 키워드 목록입니다.
- Cull: 렌더링할 면을 정의합니다.
- ZWrite: 깊이 버퍼에 쓰기 여부를 정의합니다.
- Blend: 렌더링된 결과를 기존 이미지와 혼합하는 방식을 정의합니다.
- Shader: 렌더링에 사용되는 쉐이더 코드를 정의합니다.
예를 들어, 텍스처를 사용하여 오브젝트를 렌더링하는 Pass는 다음과 같이 코드를 작성합니다.
Pass
{
Name "ForwardBase"
Tags { "RenderType"="Opaque" }
Cull Back
ZWrite On
Blend SrcAlpha OneMinusSrcAlpha
Shader "Unlit/Texture"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
Pass
{
CGPROGRAM
#pragma surface surf Standard fullforwardshadows
#pragma target 3.0
sampler2D _MainTex;
struct Input
{
float2 uv_MainTex;
};
half _Glossiness;
fixed4 _Color;
void surf (Input IN, inout SurfaceOutputStandard o)
{
// Albedo comes from a texture tinted by color
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
// Output
o.Albedo = c.rgb;
o.Metallic = _Glossiness;
o.Smoothness = _Glossiness;
o.Alpha = c.a;
}
ENDCG
}
}
}
}
이 코드는 "ForwardBase"라는 이름의 Pass를 정의하며, 텍스처 "_MainTex"를 사용하여 오브젝트를 렌더링합니다.
Unity 공식 문서 및 튜토리얼: https://docs.unity3d.com/kr/2021.3/Manual/SL-VertexFragmentShaderExamples.html
'Unity' 카테고리의 다른 글
Unity Light : 조명 (0) | 2024.03.15 |
---|---|
Unity Shader : 코드 분석 (0) | 2024.03.14 |
RigidbodyConstraints : 회전과 위치 제어 (0) | 2024.03.09 |
Rigidbody에서 오브젝트에 힘을 가할 때 사용되는 ForceMode (0) | 2024.02.21 |
Unity에서 UnityWebRequest를 이용해 웹 접속하는 방법 (0) | 2024.02.16 |