[Unity/Shader] 2단계. Unity Shader Graph 기초

Jaeyoung Ko·2025년 5월 15일

이번 포스팅은 Shader Graph 에 관한 것이다.

Shader? Shader Graph

유니티에서 Shader 작업을 위해 새 객체를 생성할 때, Shader와 Shader Graph가 있어 헷갈릴 것이다.

전자로 생성하게 되면 앞서 말했던 HLSL로 네이티브로 직접 셰이더 랭귀지로 작성하게 된다.

위 이미지처럼 기본으로 표준 셰이더를 생성하면 다음과 같이 나온다.


Shader "Custom/NewSurfaceShader"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        sampler2D _MainTex;

        struct Input
        {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
        // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
        // #pragma instancing_options assumeuniformscaling
        UNITY_INSTANCING_BUFFER_START(Props)
            // put more per-instance properties here
        UNITY_INSTANCING_BUFFER_END(Props)

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}




하지만, 오늘은 Shader GRAPH 에 대해 알아볼 것이기에 바로 그래프로 넘어가보겠다.

다양한 종류의 그래프가 존재해서 굉장히 곤란하다고 생각할 것이다.

URP

URP 는 유니티에서 Universal Rendering Pipeline으로 내가 진행 중인 프로젝트에서 선택한 유니티의 최신 랜더링 파이프라인이다. 이 URP 하에서의 셰이더 그래프는 다음과 같다.

Lit vs Unlit

둘의 차이는 Lighting 의 영향을 받는가 에 달려 있다.

Lit 은 표준 라이팅 모델에 기반한 셰이더 그래프로,

Albedo, Normal, Metallic, Smoothness 등이 포함된 Material의 Surface Properties와

다양한 광원과의 상호작용에 관한 것이다.

그에 반해, Unlit 은 광원의 영향없이 자체적인 색상과 택스쳐를 그대로 표현하는 셰이더 그래프이다. 라이팅 계산과정이 제외되기에 당연하게도 성능적인 이점을 가지며, 라이팅 적용을 하지 않는 보통 UI 요소나 빛을 받지 않는 오브젝트에 사용된다.



2D vs 3D

유니티에서 2D와 3D 환경은 여러가지 면에서 뚜렷한 차이를 보인다.

3D 환경에서

(1) Renderer : Sprite Renderer vs Mesh Renderer

2D 에서는 이미지 아틀라스를 이용한 스프라이트 기반의 Sprite Renderer에 의존한다.

반면 3D 에서는 3차원 model의 표면 즉, polygon을 이용한 Mesh Renderer에 의존한다.

(2) Rendering Queue

2D에서는 기본적으로 Transparent 랜더링 큐를 사용하나,

3D는 투명도에 따라 Opaque 또는 Transparent 랜더링 큐를 사용한다.

이 말을 한 이유는, 셰이더 그래프도 앞에 Sprite- 가 붙은 것이 2D Sprite Renderer를 위한 셰이더 작성인 것이다.



셰이더 그래프에서 필수 주의사항

property를 정의할 때, 그래프 인스펙터 창을 보면,

다음과 같은 창을 볼 수 있다.

Name은 변수명처럼 직접 정의하나, 실제로 이 그래프가 HLSL로 변환되어 셰이더 작업을 진행할 때에는 Reference Name 으로 들어가기 때문에 이 레퍼런스 명명을 제대로 해주어야 한다.

중요한 전역변수에는 다음과 같이 존재한다.

_CameraOpaqueTexture 와 _CameraSortingLayerTexture 

_CameraOpaqueTexture

3D 환경에서 Opaque 랜더링 큐에 속하는 모든 오브젝트가 랜더링된 이후의 컬러 정보를 담고 있는 텍스처이다. 즉, 간단히 말해 Opaque 불투명 부의 최종 씬 컬러 이다. 즉, 모든 랜더링이 완료되고 후처리를 할 때 이용하면 되는 것이다.

_CameraSortingLayerTexture

2D 환경에서 SortingLayer 별로 랜더링된 후의 최종 컬러 텍스처로 위의 _CameraOpaqueTexture 와 마찬가지 역할이다.



랜더링 순서

1. 3D 환경

3D 환경에서는 오브젝트의 불투명도 (Opacity)깊이 (Depth) 를 기반으로 렌더링 순서가 결정되는 것이 일반적이다.

Background (1000)

가장 먼저 렌더링되며 주로 스카이박스나 배경색을 그리는 불투명 오브젝트

Geometry (2000)

불투명한 오브젝트들이 렌더링되는 기본 큐 (대부분의 일반적인 3D 모델)
깊이 테스트 (Depth Test) 로 처리

AlphaTest (2450)

텍스처의 알파 채널을 기준으로 완전히 불투명하거나 완전히 투명한 픽셀을 갖는 오브젝트
나뭇잎이나 뚫린 울타리 등 사용

Transparent (3000)

투명하거나 반투명한 오브젝트
알파 블렌딩 (Alpha Blending) 을 사용하여 뒤에 있는 오브젝트와 혼합되어 보이도록 처리

Overlay (4000)

가장 나중에 렌더링되는 UI 요소, 특수 효과 등에 사용
일반적으로 깊이 테스트 하지 않는다.


2. 2D 환경 (Sprite Renderer)

Background (1000)

가장 먼저 렌더링되는 배경 요소

Default (0)

(명시적으로 큐를 지정하지 않은 경우) 스프라이트 렌더러의 기본 렌더링 큐

Transparent (3000)

2D 스프라이트는 알파 채널을 이용한 투명 효과를 자주 사용하므로, Transparent 큐를 사용하는 경우가 많다.
소팅 레이어 (Sorting Layer) 와 Order in Layer 설정을 통해 같은 큐 내에서의 렌더링 순서를 추가적으로 제어

Overlay (4000)

UI 요소 등 항상 최상위에 그려져야 하는 스프라이트에 사용

profile
안녕하세요, 고재영입니다. 언제나 즐겁게 살려고 노력합니다.

0개의 댓글