Version: 2021.3
ShaderLab: 서브셰이더 정의
ShaderLab: 서브셰이더에 LOD 값 할당

ShaderLab: 서브셰이더에 태그 할당

이 페이지는 ShaderLab 코드에서 Tags 블록을 사용하여 서브셰이더에 태그를 할당하는 방법에 대한 정보를 포함합니다.

서브셰이더를 정의하는 방법에 대한 내용은 ShaderLab: 서브셰이더 정의를 참조하십시오. 셰이더 오브젝트의 작동 방식 및 셰이더 오브젝트, 서브셰이더와 패스의 관계에 대해 알아보려면 셰이더 오브젝트를 참조하십시오.

개요

태그는 데이터의 키-값 쌍입니다. Unity는 사전 정의된 키와 값을 사용하여 특정 서브셰이더를 사용하는 방식과 시점을 결정합니다. 커스텀 값으로 직접 커스텀 서브셰이더 태그를 만들 수도 있습니다. C# 코드에서 서브셰이더 태그에 액세스할 수 있습니다.

렌더 파이프라인 호환성

기능 이름 빌트인 렌더 파이프라인 유니버설 렌더 파이프라인(URP) 고해상도 렌더 파이프라인(HDRP) 커스텀 SRP
ShaderLab: 서브셰이더 태그 블록 지원 지원 지원 지원
ShaderLab: RenderPipeline SubShader 태그 지원 안 함 지원 지원 지원 안 함
ShaderLab: Queue SubShader 태그 지원 안 함 지원 지원

지원

참고: 커스텀 SRP에서 직접 렌더링 순서를 정의하고 렌더 대기열 사용 여부를 선택할 수 있습니다. 자세한 내용은 DrawingSettings 및 SortingCriteria를 참조하십시오.
ShaderLab: RenderType SubShader 태그 지원 지원 지원 지원
ShaderLab: DisableBatching SubShader 태그 지원 지원 지원 지원
ShaderLab: ForceNoShadowCasting SubShader 태그 지원 지원 지원

일반 그림자를 비활성화하지만, 컨택트 그림자에는 영향이 없습니다.
지원
ShaderLab: CanUseSpriteAtlas SubShader 태그 지원 지원 지원 지원
ShaderLab: PreviewType SubShader 태그 지원 지원 지원 지원

서브셰이더에서 Tags 블록 사용

ShaderLab에서는 SubShader 블록 안에 Tags 블록을 넣어 서브셰이더에 태그를 할당합니다.

서브셰이더와 패스 모두 Tags 블록을 사용하지만, 두 가지는 서로 다르게 작동합니다. 서브셰이더 태그를 패스에 할당하는 것은 효과가 없으며, 반대도 마찬가지입니다. Tags 블록을 사용해야만 변화가 일어납니다.

  • 패스 태그를 정의하려면 Pass 블록 안에 Tags 블록을 넣으십시오.
  • 서브셰이더 태그를 정의하려면 SubShader 블록의 내부이지만 Pass 블록의 외부인 위치에 Tags 블록을 넣으십시오.

패스에 태그를 할당하는 방법에 대한 정보는 패스에 태그 할당을 참조하십시오.

서명 기능
Tags { “[name1]” = “[value1]” “[name2]” = “[value2]”} 주어진 태그를 서브셰이더에 적용합니다.

원하는 수만큼 태그를 정의할 수 있습니다.

C# 코드와 함께 서브셰이더 태그 사용

다음과 같이 Material.GetTag API를 사용하여 C# 스크립트의 서브셰이더 태그를 읽을 수 있습니다.

using UnityEngine;

public class Example : MonoBehaviour
{
    // Attach this to a gameObject that has a Renderer component
    string tagName = "ExampleTagName";

    void Start()
    {
        Renderer myRenderer = GetComponent<Renderer>();
        string tagValue = myRenderer.material.GetTag(ExampleTagName, true, "Tag not found");
        Debug.Log(tagValue);
    }
}

RenderPipeline 태그

RenderPipeline 태그는 서브셰이더가 유니버설 렌더 파이프라인(URP) 또는 고해상도 렌더 파이프라인(HDRP)과 호환되는지 여부를 Unity에 알립니다.

구문 및 유효값

서명 기능
“RenderPipeline” = “[name]” 이 서브셰이더가 URP 또는 HDRP와 호환되는지 여부를 Unity에 알립니다.
파라미터 기능
[이름] UniversalRenderPipeline 이 서브셰이더는 URP와만 호환됩니다.
HighDefinitionRenderPipeline 이 서브셰이더는 HDRP와만 호환됩니다.
(기타 모든 값, 또는 선언되지 않음) 이 서브셰이더는 URP 및 HDRP와 호환되지 않습니다.

예제

이 예제 코드는 서브셰이더가 URP와 호환됨을 선언합니다.

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

Queue 태그

Queue 태그는 Unity가 렌더링하는 지오메트리에 어느 렌더 대기열을 사용할지를 Unity에 알립니다. 렌더 대기열은 Unity가 지오메트리를 렌더링하는 순서를 결정하는 요인 중 하나입니다.

구문 및 유효값

두 가지 방법으로 Queue 태그를 사용할 수 있습니다. 하나는 Unity에 이름이 지정된 렌더 대기열을 사용하도록 지시하는 것이며, 또 다른 방법은 이름이 지정된 렌더 대기열 이후에 렌더링하는 이름이 지정되지 않은 렌더 대기열을 사용하도록 지시하는 것입니다.

서명 기능
“Queue” = “[queue name]” 이름이 지정된 렌더 대기열을 사용합니다.
“Queue” = “[queue name] + [offset]” 이름이 지정된 대기열의 주어진 오프셋에서 이름이 지정되지 않은 대기열을 사용합니다.

이러한 사용이 유용한 경우의 한 가지 예는 불투명한 오브젝트 이후 및 투명한 오브젝트 전에 드로우해야 하는 투명한 물입니다.
서명 기능
[대기열 이름] Background Background 렌더 대기열을 지정합니다.
지오메트리(Geometry) Geometry 렌더 대기열을 지정합니다.
AlphaTest AlphaTest 렌더 대기열을 지정합니다.
Transparent Transparent 렌더 대기열을 지정합니다.
Overlay Overlay 렌더 대기열을 지정합니다.
[오프셋] integer Unity가 이름이 지정된 대기열을 기준으로 이름이 지정되지 않은 대기열을 렌더하는 인덱스를 지정합니다.

C# 코드와 함께 이 태그 사용

Shader.renderQueue를 사용하여 셰이더 오브젝트의 활성 서브셰이더의 대기열 태그 값을 읽을 수 있습니다.

기본적으로 Unity는 [Queue] 태그에서 지정된 렌더 대기열의 지오메트리를 렌더링합니다. 이 값은 머티리얼당 기반으로 오버라이드할 수 있습니다. Unity 에디터의 머티리얼 인스펙터에서 Render Queue 프로퍼티를 설정하여 이를 수행할 수 있습니다. C# 스크립트에서는 Rendering.RenderQueue 열거형을 사용하여 Material.renderQueue 값을 설정해 이를 수행할 수 있습니다.

예제

이 예제 코드는 Transparent 렌더 대기열의 일부로 지오메트리를 렌더링하는 서브셰이더를 만듭니다.

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

이 예제 코드는 Geometry 대기열 이후 이름이 지정되지 않은 대기열의 지오메트리를 렌더링하는 서브셰이더를 만듭니다.

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

RenderType 태그

RenderType 태그를 사용하여 셰이더 오브젝트의 동작을 오버라이드할 수 있습니다.

빌트인 렌더 파이프라인에서 런타임 시 셰이더 대체 기법을 사용하여 서브셰이더를 교체할 수 있습니다. 이 기법은 일치하는 RenderType 태그 값이 있는 서브셰이더를 식별하여 작동합니다. 이 기법은 일부 경우 카메라의 뎁스 텍스처를 만드는 데 사용됩니다.

스크립터블 렌더 파이프라인에 기반한 렌더 파이프라인에서 RenderStateBlock 구조체를 사용하여 셰이더 오브젝트에 정의된 렌더 상태를 오버라이드할 수 있습니다. RenderType 태그의 값을 사용하여 오버라이드할 서브셰이더를 식별할 수 있습니다.

구문 및 유효값

서명 기능
“RenderType” = “[renderType]” 이 서브셰이더의 RenderType 값을 설정합니다.
서명 기능
[renderType] String 이 파라미터의 설정값은 없습니다. 교체할 서브셰이더의 RenderType 값을 식별하려면 해당 서브셰이더의 셰이더 소스 파일을 여십시오.

Unity 레거시 빌트인 셰이더의 RenderType 서브셰이더 태그는 셰이더 대체 페이지에 나열되어 있습니다.

커스텀 서브셰이더의 값을 직접 생성할 수도 있습니다.

C# 코드와 함께 이 태그 사용

빌트인 렌더 파이프라인의 셰이더 대체에 대한 내용은 셰이더 대체를 참조하십시오. 스크립터블 렌더 파이프라인에서 RenderStateBlock을 사용하는 방법에 대한 정보는 ScriptableRenderContext.DrawRenderers에 대한 API 문서를 참조하십시오.

예제

이 예제 코드는 RenderType 값이 TransparentCutout인 서브셰이더를 만듭니다.

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

ForceNoShadowCasting 태그

ForceNoShadowCasting 태그는 서브셰이더의 지오메트리가 그림자를 드리우는 일(그리고 일부 경우 그림자를 받는 일)을 방지합니다. 정확한 동작은 렌더 파이프라인과 렌더링 경로에 따라 다릅니다.

이 태그는 셰이더 대체를 사용하지만, 다른 서브셰이더의 그림자 패스를 상속하지 않으려는 경우 유용합니다.

구문 및 유효값

서명 기능
“ForceNoShadowCasting” = “[state]” 이 서브셰이더를 사용하는 모든 지오메트리에 대해 그림자 드리우기(그리고 일부 경우 그림자 받기)를 방지하는지 여부를 나타냅니다.
서명 기능
[상태] True Unity가 이 서브셰이더의 지오메트리가 그림자를 드리우는 일을 방지합니다.

또한 빌트인 렌더 파이프라인의 포워드, 레거시 버텍스 릿 또는 레거시 디퍼드 렌더링 경로에서 Unity는 이 서브셰이더가 그림자를 받는 일을 방지합니다.

HDRP에서는 이 상태에서 Unity가 지오메트리의 컨택트 그림자 드리우기를 방지하지 않습니다.
False Unity가 이 서브셰이더의 지오메트리가 그림자를 드리우거나 받는 일을 방지하지 않습니다(기본값).

예제

이 예제 코드는 ForceNoShadowCasting 값이 True인 서브셰이더를 만듭니다.

Shader "ExampleShader" {
    SubShader {
        Tags { "ForceNoShadowCasting" = "True" }
        Pass {
            …
        }
    }
}

DisableBatching 태그

DisableBatching 서브셰이더 태그는 Unity가 이 서브셰이더를 사용하는 지오메트리에 동적 배칭을 적용하는 일을 방지합니다.

이는 오브젝트 공간 연산을 수행하는 셰이더 프로그램에 유용합니다. 동적 배칭은 모든 지오메트리를 월드 공간으로 변환합니다. 즉, 셰이더 프로그램이 더 이상 오브젝트 공간에 액세스할 수 없게 됩니다. 따라서 오브젝트 공간에 의존하는 셰이더 프로그램은 올바르게 렌더링하지 않습니다. 이 문제를 방지하려면 이 서브셰이더 태그를 사용하여 Unity가 동적 배칭을 적용하는 일을 방지하십시오.

구문 및 유효값

서명 기능
“DisableBatching” = “[state]” Unity가 이 서브셰이더를 사용하는 모든 지오메트리의 동적 배칭을 방지하는지 여부를 나타냅니다.
서명 기능
[상태] True Unity가 이 서브셰이더를 사용하는 지오메트리의 동적 배칭을 방지합니다.
False Unity가 이 서브셰이더를 사용하는 지오메트리의 동적 배칭을 방지하지 않습니다(기본값).
LODFading Unity가 LODGroup의 일부이며 페이드 모드 값이 None이 아닌 모든 지오메트리의 동적 배칭을 방지합니다. 이외의 경우 Unity가 동적 배칭을 방지하지 않습니다.

예제

이 예제 코드는 DisableBatching 값이 True인 서브셰이더를 만듭니다.

Shader "ExampleShader" {
    SubShader {
        Tags { "DisableBatching" = "True" }
        Pass {
            …
        }
    }
}

IgnoreProjector 태그

빌트인 렌더 파이프라인에서 IgnoreProjector 서브셰이더 태그는 지오메트리가 프로젝터의 영향을 받는지 여부를 Unity에 알립니다. 프로젝터와 호환되지 않는 반투명 지오메트리를 제외하는 데 가장 유용합니다.

이 태그는 다른 렌더 파이프라인에서는 효과가 없습니다.

구문 및 유효값

서명 기능
“IgnoreProjector” = “[state]” Unity가 이 지오메트리를 렌더링할 때 프로젝터를 무시하는지 여부를 나타냅니다.
서명 기능
[상태] True Unity가 이 지오메트리를 렌더링할 때 프로젝터를 무시합니다.
False Unity가 이 지오메트리를 렌더링할 때 프로젝터를 무시하지 않습니다(기본값).

예제

이 예제 코드는 IgnoreProjectors 값이 True인 서브셰이더를 만듭니다.

Shader "ExampleShader" {
    SubShader {
        Tags { "IgnoreProjector" = "True" }
        Pass {
            …
        }
    }
}

PreviewType 태그

PreviewType 서브셰이더는 이 서브셰이더를 사용하는 머티리얼을 머티리얼 인스펙터에 어떻게 표시할지를 알립니다.

구문 및 유효값

서명 기능
“PreviewType” = “[shape]” Unity 에디터가 이 서브셰이더를 사용하는 머티리얼의 프리뷰를 표시하는 데 어떤 도형을 사용할지를 나타냅니다.
서명 기능
[형태] 구체(Sphere) 구체에 머티리얼을 표시합니다(기본값).
평면(Plane) 평면에 머티리얼을 표시합니다.
Skybox 스카이박스에 머티리얼을 표시합니다.

예제

이 예제 코드는 PreviewType 값이 Plane인 서브셰이더를 만듭니다.

Shader "ExampleShader" {
    SubShader {
        Tags { "PreviewType" = "Plane" }
        Pass {
            …
        }
    }
}

CanUseSpriteAtlas 태그

레거시 스프라이트 패커를 사용하는 프로젝트에서 이 서브셰이더 태그를 이용해 셰이더가 원본 텍스처 좌표에 의존하며, 따라서 해당 셰이더의 텍스처를 아틀라스로 패킹하지 말 것을 사용자에게 경고할 수 있습니다.

구문 및 유효값

서명 기능
“CanUseSpriteAtlas” = “[state]” 이 서브셰이더를 사용하는 스프라이트가 레거시 스프라이트 패커와 호환되는지 여부를 나타냅니다.
서명 기능
[상태] True 이 서브셰이더를 사용하는 스프라이트가 레거시 스프라이트 패커와 호환됩니다(기본값).
False 이 서브셰이더를 사용하는 스프라이트가 레거시 스프라이트 패커와 호환되지 않습니다.

CanUseSpriteAtlas 값이 False인 서브셰이더가 레거시 스프라이트 패커 패킹 태그가 있는 스프라이트와 함께 사용되는 경우, Unity가 인스펙터에 오류 메시지를 표시합니다.

CanUseSpriteAtlas 태그 코드 예제

이 예제 코드는 CanUseSpriteAtlas 값이 False인 서브셰이더를 만듭니다.

Shader "ExampleShader" {
    SubShader {
        Tags { "CanUseSpriteAtlas" = "False" }
        Pass {
            …
        }
    }
}
ShaderLab: 서브셰이더 정의
ShaderLab: 서브셰이더에 LOD 값 할당