Unity

Unity Shader : 기초

코샵 2024. 3. 13. 14:53
반응형
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