[Unity] URP 셰이더 HLSL ShaderLab Properties, SubShader Tags

2023. 6. 12. 14:07Unity

728x90
반응형

Properties

https://docs.unity3d.com/kr/2021.1/Manual/SL-Properties.html

 

ShaderLab: 머티리얼 프로퍼티 정의 - Unity 매뉴얼

이 페이지는 ShaderLab 코드에서 Properties 블록을 사용하여 셰이더 오브젝트의 머티리얼 프로퍼티를 정의하는 방법에 대한 정보를 포함합니다.

docs.unity3d.com

유니티 매뉴얼에 프로퍼티에 대한 내용이 잘 나와있다.

 

 

  • Integer, Int

정수형에 대한 설명이다. 

_ExampleName ("Integer display name", Integer) = 1
_ExampleName ("Int display name", Int) = 1

 

 

  • Float

Float와 Range 타입이 있다. Range 타입은 재질 편집기에서 슬라이더 형태로 보인다. 범위를 명시할 수 있으며 최소 값이 0이 되지 않아야 한다면 Range(0.001, 1.0) 식으로 쓸 수 있다. Range의 역할은 재질 에디터에서 입력을 막아줄 뿐이고 C# 스크립트에 의해 직접 값을 설정하는 것까지 막을 수는 없다.

_ExampleName ("Float display name", Float) = 0.5
_ExampleName ("Float with range", Range(0.0, 1.0)) = 0.5

 

 

  • Texture2D

2D 텍스쳐 타입이며 색상 키워드를 입력하지 않으면 회색으로 보인다. 키워드는 "white", "black", "gray", "bump", "red"가 있다.

_ExampleName ("Texture2D display name", 2D) = "" {}
_ExampleName ("Texture2D display name", 2D) = "red" {}

 

 

  • Texture2DArray

텍스쳐 배열 타입이다. 여러 장의 텍스쳐를 하나의 오브젝트로 묶어서 인덱스를 사용해서 샘플링하는 방식이다. Custom Terrain 셰이더 또는 애니메이션을 위한 여러 텍스쳐 처리 시 드로우콜 증가 없이 처리할 수 있다.

_ExampleName ("Texture2DArray display name", 2DArray) = "" {}

텍스쳐를 [2D Array]로 설정해야 한다.

 

HLSL 셰이더에서 샘플링 하는 함수는 다음과 같다.

half4 color = UNITY_SAMPLE_TEX2DARRAY(textureName, coord2); //Legacy
half4 color = SAMPLE_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) //URP

 

 

  • Texture3D

안개나 연기 같은 시뮬레이션 혹은 애니메이션 텍스쳐를 저장하는 데에 사용한다.

_ExampleName ("Texture3d", 3D) = "" {}

에디터에서 텍스쳐 설정을 [3D]로 바꿔야 한다.

 

 

  • Cubemap, CubemapArray

스카이박스를 위해 가공된 텍스쳐 형식을 말한다.

_ExampleName ("Cubemap", Cube) = "" {}
_ExampleName ("CubemapArray", CubeArray) = "" {}

해당 텍스쳐 설정을 [Cube]로 바꿔야 한다.

 

셰이더에서 샘플링하는 URP 함수는 다음과 같다.

SAMPLE_TEXTURECUBE(textureName, samplerName, coord3)
SAMPLE_TEXTURECUBE_ARRAY(textureName, samplerName, coord3, index)

 

 

  • Vector
_ExampleName ("Example vector", Vector) = (.25, .5, .5, 1)

 

 

  • Color
_ExampleName ("Example color", color) = (.25, .5, .5, 1)

 

 


 

 

SubShader

// 이것은 주석입니다. (Comment)
Shader "Custom/ShaderLab HLSL/CustomUnlit"
{
    Properties
    {  }
    SubShader
    {
        Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct Attributes
            {
                float4 positionOS   : POSITION;
            };

            struct Varyings
            {
                float4 positionHCS  : SV_POSITION;
            };

            Varyings vert(Attributes IN)
            {
                Varyings OUT;
                OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                return OUT;
            }

            half4 frag(Varyings IN) : SV_Target
            {
                half4 color = half4(0, 1, 0, 1);
                return half4(0, 1, 0, 1);
            }
            ENDHLSL
        }
    }
}

예시 코드이며 SubShader 이후 그 중괄호로 묶인 전체가 포함된다. 프로퍼티 바로 다음에 위치하며 하나 이상의 SubShader가 있을 수 있다.

 

 

SubShader Tags

Tags를 통해 렌더링 방법과 시기를 결정한다. 일부 필수를 제외하면 생략되는 태그가 많다.

 

 

  • RenderPipeline

URP나 HDRP용으로 만들어졌다는 사실을 엔진에 알려준다. URP용 셰이더라면 필수로 사용해야 한다.

Shader "ExampleShader" {
    SubShader {
        Tags { "RenderPipeline" = "UniversalRenderPipeline" }
        Pass {...
        }
    }
}

 

 

  • Queue

재질 에디터에게 이 셰이더가 사용하는 기본 렌더 큐 번호를 알려준다. 셰이더 Blend Mode가 Additive라면 반드시 Queue를 Transparent로 설정해야 정상적으로 셰이딩이 된다.

Shader "ExampleShader" {
    SubShader {
        Tags { "Queue = Transparent" }
        Pass {...
        }
    }
}

재질마다 수동으로 렌더 큐 번호를 변경하면 유니티는 재질의 셰이더가 변경될 때마다 지정된 렌더 큐로 되돌리기 때문에 초기화되는 실수가 나올 수 있다.

 

지정된 번호는 다음과 같다.

  • Opaque
    • Background: 1000
    • Geometry: 2000, Default
    • AlphaTest: 2450
  • Transparent
    • Transparent: 3000
    • Overlay: 4000, 렌즈 플레어 등

 

위 지정된 수를 이용하여 키워드와 숫자를 조합할 수 있다. 문자열 사이에 공백이 있어서는 안 된다.

Shader "ExampleShader" {
    SubShader {
        Tags { "Queue" = "Geometry+1" }
        Pass {...
        }
    }
}
Shader "ExampleShader" {
    SubShader {
        Tags { "Queue" = "2001" }
        Pass {...
        }
    }
}

 

 

  • RenderType

셰이더를 정해진 그룹별로 구분하기 위해 사용한다. 예를 들어 가장자리를 검출하는 Edge-detection을 해야 한다면 Noraml 정보가 있는 솔리드 오브젝트만 구분해서 노멀 렌더랑 이미지를 얻어내고, 방향이 달라지는 곳이 모서리라는 원리로 가장자리를 검출한다.

또는 Shader Replacement 기능으로 특정 렌더 타입을 원하는 셰이더로 교체해서 카메라에 렌더링 할 수도 있다.

Shader "ExampleShader" {
    SubShader {
        Tags { "RenderType" = "TransparentCutout" }
        Pass {...
        }
    }
}

 

 

  • ForceNoShadowCasting

렌더 파이프라인에 의해 그림자를 만들거나 받지 않도록 한다.

Tags {"ForceNoShadowCasting" = "True"}
Tags {"ForceNoShadowCasting" = "False"}

 

 

  • DisableBatching

다이나믹 배칭을 하지 않도록 한다. 다이나믹 배칭은 모든 Mesh가 월드 스페이스로 변환되는데, 셰이더에서 오브젝트 스페이스가 필요한 경우에 사용한다.

Tags {"DisableBatching" = "True"}
Tags {"DisableBatching" = "False"}
Tags {"DisableBatching" = "LODFading"}

 

 

  • IgnoreProjector

마법 장판에 사용되는 프로젝터에 영향을 받지 않는다.

Tags {"IgnoreProjector" = "True"}
Tags {"IgnoreProjector" = "False"}

 

 

  • PreviewType

에디터 재질 Inspector에서 어떤 모양으로 보일지 선택한다.

Tags {"PreviewType" = "Sphere"}
Tags {"PreviewType" = "Plane"}
Tags {"PreviewType" = "Skybox"}

 

 


참고자료

 

아티스트를 위한 유니티 URP 셰이더 입문 - YES24

셰이더(Shader)를 HLSL(High Level Shader Language)로 다루고 싶은 아티스트를 위한 입문서다. 아티스트들의 눈높이에 맞추어 기초 그래픽스 이론과 셰이더 개념을 설명하고, 이를 유니티 엔진에서 활용할

www.yes24.com

728x90
반응형