Unity Shader : 기초

2024. 3. 13. 14:53·Unity
반응형
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 : 회전과 위치 제어  (1) 2024.03.09
Rigidbody에서 오브젝트에 힘을 가할 때 사용되는 ForceMode  (0) 2024.02.21
Unity에서 UnityWebRequest를 이용해 웹 접속하는 방법  (0) 2024.02.16
'Unity' 카테고리의 다른 글
  • Unity Light : 조명
  • Unity Shader : 코드 분석
  • RigidbodyConstraints : 회전과 위치 제어
  • Rigidbody에서 오브젝트에 힘을 가할 때 사용되는 ForceMode
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (730)
      • 스마트팜 (1)
      • 상품 추천 (223)
      • DataBase (0)
        • MongoDB (4)
        • PostgreSQL (0)
      • 하드웨어 (19)
      • 일기장 (4)
      • 파이썬 (131)
        • Basic (42)
        • OpenCV (8)
        • Pandas (15)
        • PyQT (3)
        • SBC(Single Board Computer) (1)
        • 크롤링 (14)
        • Fast API (29)
        • Package (6)
      • Unity (138)
        • Tip (41)
        • Project (1)
        • Design Pattern (8)
        • Firebase (6)
        • Asset (2)
      • Linux (5)
      • C# (97)
        • Algorithm (11)
        • Window (7)
      • TypeScript (51)
        • CSS (10)
      • Git (11)
      • SQL (5)
      • Flutter (10)
        • Tip (1)
      • System (1)
      • BaekJoon (6)
      • Portfolio (2)
      • MacOS (1)
      • 유틸리티 (1)
      • 서비스 (6)
      • 자동화 (3)
      • Hobby (10)
        • 물생활 (10)
        • 식집사 (0)
  • 인기 글

  • 태그

    unity
    카페24리뷰
    codingtips
    ipcamera
    스크립트 실행 순서
    appdevelopment
    라떼우유
    카페24리뷰이관
    셀레니움
    rtsp
    devlife
    programmerlife
    programming101
    리스트
    긴유통기한우유
    상품 리뷰 크롤링
    리뷰관리
    스마트스토어리뷰
    codingcommunity
    파이썬
    유니티
    쇼핑몰리뷰
    learntocode
    cv2
    리뷰이관
    믈레코비타멸균우유
    Python
    스크립트 실행
    C#
    list
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코샵
Unity Shader : 기초
상단으로

티스토리툴바