유니티 URP 쉐이더 - yuniti URP sweideo

셰이더 그래프

노드 기반 비주얼 저작 툴을 사용해 아름답고 역동적인 셰이더를 만드세요.

유니티 URP 쉐이더 - yuniti URP sweideo

셰이더 제작 단순화

셰이더 그래프에서는 셰이더를 시각적으로 저작하고 실시간으로 결과를 확인할 수 있습니다. 이 노드 기반 시스템에서는 그래프 네트워크에서 노드를 연결하기만 하면 아티스트와 다른 팀원들도 참여가 가능합니다. 

고품질 셰이더를 제작해 워크플로를 간소화합니다. 노드를 시각적으로 생성해 연결하고 프리뷰를 통해 즉시 작업 내용을 확인해 반복 작업 속도를 높일 수 있습니다.

  • 직관적인 셰이더 제작
  • 비전에 맞게 커스터마이즈
  • 인터랙티브 셰이더 리스폰스
  • 파이프라인 기준 렌더
  • 정밀한 제작

유니티 URP 쉐이더 - yuniti URP sweideo

직관적인 셰이더 제작

셰이더 그래프를 사용하면 셰이더 생성 과정의 모든 단계에서 반복 시간이 단축됩니다. 거의 모든 노드에 단계별 출력을 확인할 수 있는 빌트인 프리뷰가 제공됩니다. 그래프 자체에 전체 프리뷰가 있으므로 셰이더의 최종 결과를 확인할 수 있습니다. 씬의 모델에 셰이더를 적용할 경우 저장하자마자 셰이더가 업데이트되므로 업데이트 내용이 즉각적으로 적용됩니다. 코드 구문, 컴파일, 작성이 수월하게 이루어지므로 창의력을 발휘하는 데 장애가 되는 요소가 사라집니다.

유니티 URP 쉐이더 - yuniti URP sweideo

비전에 맞게 커스터마이즈

셰이더 그래프 에셋은 여러 다른 머티리얼에 맞게 사전 구성된 옵션을 제공합니다. 셰이더 그래프의 노드는 수학 함수, 절차적 패턴 등 머티리얼이 적용되는 오브젝트에 대한 데이터를 나타냅니다. 커스텀 함수 노드를 사용해 나만의 커스텀 함수를 추가하거나 노드를 서브그래프에 래핑해 커스텀 계산으로 노드 라이브러리를 확장하세요.

유니티 URP 쉐이더 - yuniti URP sweideo

인터랙티브 셰이더 리스폰스

셰이더 그래프는 씬에서 직접 정보를 가져올 수 있기 때문에 사용자의 동작에 반응하는 애니메이션 효과와 인터랙티브 효과를 생성할 수 있습니다. 셰이더 그래프는 커스텀 컬러 스킨, 첨벙이는 물결 또는 산들바람에 가볍게 날아다니는 나뭇잎 등 프로젝트에 현실감을 불어넣는 효과를 살릴 수 있게 도와줍니다.

유니티 URP 쉐이더 - yuniti URP sweideo

파이프라인에 따라 렌더

유니티 URP 쉐이더 - yuniti URP sweideo

정밀한 제작

Master Stack은 셰이더의 최종 표면 형상을 정의하는 셰이더 그래프의 도착 지점입니다. 사용자가 폴리곤의 버텍스 속성이 계산되는 버텍스 단계에서 발생하는 연산과 버텍스 사이의 픽셀이 어떤 모양인지 확인하기 위해 계산이 이루어지는 프래그먼트 단계에서 발생하는 연산의 관계를 시각화할 수 있게 도와줍니다. 셰이더 계산을 보다 정밀하게 제어하려면 버텍스 단계에 자체적인 인터폴레이터 블록을 추가하세요.

새로운 리소스

유니티 URP 쉐이더 - yuniti URP sweideo

아티스트를 위한 2021.2의 새로운 기능

아티스트와 디자이너가 창의적인 워크플로를 최적화하고 강력하면서 몰입도 높은 경험을 개발하는 데 도움을 주기 위해 개발된 최신 기능과 개선 사항을 확인해 보세요.

유니티 URP 쉐이더 - yuniti URP sweideo

2021.2 릴리스의 셰이더 그래프 업데이트

2021.2 릴리스에 소개되는 셰이더 그래프의 새로운 기능을 통해 크게 향상된 아티스트 워크플로와 셰이더 성능을 발견하세요.

유니티 URP 쉐이더 - yuniti URP sweideo

테크니컬 아티스트를 위한 Unity 가이드

Unity를 활용한 강력한 비주얼 게임 제작에 힘이 되어 줄 툴 세트와 워크플로에 대한 최종 가이드를 이용하세요.

더 많은 아티스트 툴 살펴보기

아티스트 사용에 최적화된 강력한 Unity 솔루션으로 상상력을 마음껏 펼치세요. 실시간으로 작업 속도를 높일 수 있도록 설계된 툴이 제공하는 높은 유연성을 활용할 수 있습니다.

유니티 URP 쉐이더 - yuniti URP sweideo

URP에서 코드기반 Shader 파일을 생성하면 기본적으로 CG기반의 쉐이더가 생성됩니다.

하지만 URP 내장 쉐이더 기능이나 SRP Batcher를 사용하기 위해서는 HLSL기반으로 쉐이더를 작성해야하는데,

매번 CG쉐이더는 HLSL로 바꾸기 귀찮아서 HLSL 기본 쉐이더 생성 스크립트를 제작했습니다.

https://github.com/CatDarkGame/URPShaderTemplateGenerater

GitHub - CatDarkGame/URPShaderTemplateGenerater: URP HLSL ShaderTemplate Generater

URP HLSL ShaderTemplate Generater. Contribute to CatDarkGame/URPShaderTemplateGenerater development by creating an account on GitHub.

github.com

유니티 URP 쉐이더 - yuniti URP sweideo

사용법

유니티 URP 쉐이더 - yuniti URP sweideo

Create->URP Shader->Unlit Shader 메뉴를 클릭하면 HLSL 기반 기본 Unlit쉐이더가 생성됩니다.

Shader "URP/Unlit/#NAME#"
{
    Properties
    { 
        _MainTex ("Main Texture", 2D) = "white" {}
        _Color ("Color", Color) = (1, 1, 1, 1)
    }

    SubShader
    {
        Tags { "RenderType" = "Opaque" "Queue"="Geometry" "RenderPipeline" = "UniversalPipeline" }
   
        Pass
        {
            Name  "URPUnlit"
            Tags {"LightMode" = "SRPDefaultUnlit"}

            HLSLPROGRAM

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            #pragma prefer_hlslcc gles  
            #pragma exclude_renderers d3d11_9x 
            
            #pragma vertex vert
            #pragma fragment frag

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float2 uv : TEXCOORD0;
            }; 
            

            TEXTURE2D(_MainTex);
            SAMPLER(sampler_MainTex);

            CBUFFER_START(UnityPerMaterial)
                half4 _MainTex_ST;
                float4 _Color;
            CBUFFER_END


            v2f vert(appdata v)
            {
                v2f o;
                o.vertex = TransformObjectToHClip(v.vertex.xyz);
                o.uv = v.uv;
                return o;
            }

            float4 frag(v2f i) : SV_Target
            {
                float2 mainTexUV = i.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw;
                float4 col = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, mainTexUV);
                
                return col * _Color;
            }
            
            ENDHLSL
        }
    }
}

구현 원리

유니티 URP 쉐이더 - yuniti URP sweideo
유니티 URP 쉐이더 - yuniti URP sweideo

URPShaderTemplate/Editor/ShaderTemplates에 쉐이더 샘플 파일을 기반으로 신규 쉐이더를 제작하는 방식입니다.

namespace URPShaderTemplate
{
    // 커스텀 쉐이더 템플릿 유니티 메뉴
    public class MenuItem
    {
        // 기본 메뉴 경로
        private const string MENUITEM_BASEPATH = "Assets/Create/URP Shader/";
        // 쉐이더 템플릿 폴더 이름
        private const string SHADERTEMPLATE_FOLDERNAME = "ShaderTemplates";
        
        // Unlit 쉐이더 - 템플릿 경로, 메뉴 경로
        private const string MENUITEMNAME_UNLIT = "Unlit Shader";
        private const string SHADERTEMPLATE_UNLIT = "URPUnlitShader.shader.txt";
        [UnityEditor.MenuItem(MENUITEM_BASEPATH + MENUITEMNAME_UNLIT, false, 85)]
        public static void GenerateNewURPShader_Unlit()
        {
            string shaderTemplatePath = GenerateURPShader.GetCurrentScriptFolerPath(SHADERTEMPLATE_FOLDERNAME);
            GenerateURPShader.CreateShaderTemplate(shaderTemplatePath + SHADERTEMPLATE_UNLIT);
        }
       
        /*
        // 추가 쉐이더 템플릿 예제
        private const string MENUITEMNAME_EXAMPLE = "Example Shader";
        private const string SHADERTEMPLATE_EXAMPLE = "URPExampleShader.shader.txt";
        [UnityEditor.MenuItem(MENUITEM_BASEPATH + MENUITEMNAME_EXAMPLE, false, 85)]
        public static void GenerateNewURPShader_Example()
        {
            string shaderTemplatePath = GenerateURPShader.GetCurrentScriptFolerPath(SHADERTEMPLATE_FOLDERNAME);
            GenerateURPShader.CreateShaderTemplate(shaderTemplatePath + SHADERTEMPLATE_EXAMPLE);
        }
        */
    }

}

신규로 쉐이더 템플릿을 추가하기 위해서는 txt확장자로 샘플 쉐이더를 추가하고 MenuItem.cs의 아래 주석 부분을 복사해서 경로 & 네이밍을 맞춰주면 됩니다.

      public class GenerateURPShader
    {
        private const string LOG_FILENOTEXIST = "TemplateShader is not exists : ";
        
        // 신규 쉐이더 접두사
        private const string NEWSHADERWORD_FRONT = "New";
        
        // 쉐이더 템플릿 내부 키워드
        private const string KEYWORD_SHADERNAME = "#NAME#";
        
        
  public static void CreateShaderTemplate(string templateShaderPath)
        {
            // 템플릿 쉐이더 파일 유무 체크
            if (!System.IO.File.Exists(templateShaderPath))
            {
                Debug.LogError(LOG_FILENOTEXIST + templateShaderPath);
                return;
            }
            
            // 템플릿 쉐이더 경로 & 이름 정보 가져오기
            string newShaderFileName = GetShaderFileName(templateShaderPath);
            string newShaderName = newShaderFileName.Substring(0, newShaderFileName.Length - 7);
            
            // 생성할 폴더 경로 + 쉐이더 파일명 세팅
            string generateDirectoryPath = GetGenerateDirectoryPath(); 
            string generateAssetPath = AssetDatabase.GenerateUniqueAssetPath(generateDirectoryPath + "/" + newShaderFileName);

            // 쉐이더 코드 복사 & 키워드 수정
            string fileContent = System.IO.File.ReadAllText(templateShaderPath);
            fileContent = fileContent.Replace(KEYWORD_SHADERNAME, newShaderName);

            // 신규 쉐이퍼 파일 생성
            System.IO.FileInfo file = WriteTextFile(generateAssetPath, fileContent);
            AssetDatabase.Refresh();
        }

신규 쉐이더 파일 생성 방식은 단순하게 txt파일을 읽어서 #NAME#키워드 문자를 바꾸고 .shader파일을 생성하는 방식입니다.