Version: 2023.2
언어: 한국어
ShaderLab: 셰이더 오브젝트 정의
ShaderLab: 폴백 할당

ShaderLab: 머티리얼 프로퍼티 정의

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

개요

ShaderLab 코드에서 머티리얼 프로퍼티를 정의할 수 있습니다.머티리얼 프로퍼티는 Unity가 머티리얼 에셋의 일부로 저장하는 프로퍼티입니다.이를 통해 아티스트가 서로 다른 설정의 머티리얼을 생성하고, 수정하고 공유할 수 있습니다.

머티리얼 프로퍼티를 사용하는 경우:

  • 머티리얼에 대해 함수(예: Material.SetFloat)를 호출하여 셰이더 오브젝트의 변수 값을 가져오거나 설정할 수 있습니다.
  • 머티리얼 인스펙터를 사용하여 값을 확인하고 수정할 수 있습니다.
  • Unity는 사용자가 수행한 변경 사항이 세션 간 지속되도록 머티리얼 에셋의 일부로 저장합니다.

머티리얼 프로퍼티를 사용하지 않는 경우:

  • 이 경우에도 머티리얼에 대해 함수를 호출하여 셰이더 오브젝트의 변수 값을 가져오거나 설정할 수 있습니다.
  • 이러한 값을 볼 수 있는 시각적 에디터는 없습니다.
  • 변경 사항이 세션 간 지속되지 않습니다.

일반적으로 머티리얼 프로퍼티를 생성하지 않는 경우는 오직 스크립트만을 사용하여 셰이더 프로퍼티를 설정하려는 경우(예: 절차적 콘텐츠를 만드는 경우), 프로퍼티를 머티리얼 프로퍼티로 만들 수 없는 경우 또는 프로퍼티를 인스펙터에서 수정하지 않으려는 경우 뿐입니다.

렌더 파이프라인 호환성

기능 이름 빌트인 렌더 파이프라인 유니버설 렌더 파이프라인(URP) 고해상도 렌더 파이프라인(HDRP) 커스텀 SRP
ShaderLab: Properties 블록 지원 지원
HLSL 코드에서 SRP 배처 호환성을 위해 머티리얼당 변수를 같은 CBUFFER에 삽입해야 합니다.
지원
HLSL 코드에서 SRP 배처 호환성을 위해 머티리얼당 변수를 같은 CBUFFER에 삽입해야 합니다.
지원
HLSL 코드에서 SRP 배처 호환성을 위해 머티리얼당 변수를 같은 CBUFFER에 삽입해야 합니다.

Properties 블록 사용

ShaderLab에서 셰이더 오브젝트에 머티리얼 프로퍼티를 할당하려면 Shader 블록 안에 Properties 블록을 넣으십시오.

서명 기능
Properties
{
    <Material property declaration>
    <Material property declaration>
}
특정한 프로퍼티를 머티리얼 에셋의 일부로 저장하며, 렌더링 중 머티리얼 에셋에 저장된 값을 사용합니다.
Properties 블록은 수에 관계없이 머티리얼 프로퍼티 선언을 포함할 수 있습니다.

머티리얼 프로퍼티 선언

모든 머티리얼 프로퍼티 선언은 다음의 기본 형식을 따릅니다.

[optional: attribute] name("display text in Inspector", type name) = default value

정확한 구문은 타입별로 다릅니다.

이 섹션에는 다음 정보가 있습니다.

타입별 머티리얼 프로퍼티 선언 구문

타입 이름과 기본 값의 구문은 프로퍼티 타입에 따라 다릅니다.

보통 셰이더 코드에서는 모든 프로퍼티 이름이 밑줄로 시작합니다. 이 페이지의 예제는 이러한 규범을 따릅니다.

Type 예제 구문 주석
Integer _ExampleName ("Integer display name", Integer) = 1 뒤에 플로트가 붙는 Int 타입(아래 설명 참조)과 달리, 이 타입은 실제 정수가 뒤에 붙습니다. 정수를 사용하려면 Int 대신 사용하십시오.
Int(레거시) _ExampleName ("Int display name", Int) = 1 참고: 이 레거시 타입의 뒤에는 정수가 아닌 플로트가 붙습니다. 이전 버전과의 호환성 목적으로만 지원됩니다. Integer 타입을 대신 사용하십시오.
Float _ExampleName ("Float display name", Float) = 0.5

_ExampleName ("Float with range", Range(0.0, 1.0)) = 0.5
범위 슬라이더의 최대값과 최소값은 범위에 포함됩니다.
Texture2D _ExampleName ("Texture2D display name", 2D) = "" {}

_ExampleName ("Texture2D display name", 2D) = "red" {}
Unity의 빌트인 텍스처를 사용하려면 기본값 문자열에 “white” (RGBA: 1,1,1,1), “black” (RGBA: 0,0,0,1), “gray” (RGBA: 0.5,0.5,0.5,1), “bump” (RGBA: 0.5,0.5,1,1) 또는 “red” (RGBA: 1,0,0,1) 값을 삽입하십시오.

문자열을 비워 두거나 잘못된 값을 입력하면 기본적으로 “gray”가 적용됩니다.

참고: 이러한 기본 텍스처는 인스펙터에서 보이지 않습니다.
Texture2DArray _ExampleName ("Texture2DArray display name", 2DArray) = "" {} 자세한 내용은 텍스처 배열을 참조하십시오.
Texture3D _ExampleName ("Texture3D", 3D) = "" {} 기본값은 “그레이” (RGBA: 0.5,0.5,0.5,1) 텍스처입니다.
Cubemap _ExampleName ("Cubemap", Cube) = "" {} 기본값은 “그레이” (RGBA: 0.5,0.5,0.5,1) 텍스처입니다.
CubemapArray _ExampleName ("CubemapArray", CubeArray) = "" {} 큐브맵 배열을 참조하십시오.
Color _ExampleName("Example color", Color) = (.25, .5, .5, 1) 셰이더 코드의 float4에 매핑됩니다.

머티리얼 인스펙터가 컬러 피커를 표시합니다. 4개의 개별 플로트로 값을 수정하고 싶다면 벡터 타입을 사용하십시오.
Vector _ExampleName ("Example vector", Vector) = (.25, .5, .5, 1) 셰이더 코드의 float4에 매핑됩니다.

머티리얼 인스펙터가 4개의 개별 플로트 필드를 표시합니다. 컬러 피커를 사용하여 값을 수정하고 싶다면 컬러 타입을 사용하십시오.

예약된 머티리얼 프로퍼티 이름

Unity는 머티리얼 프로퍼티에 대해 몇 가지 미리 정한 이름이 있습니다. 이러한 이름 중 하나로 머티리얼 프로퍼티를 생성하면 Unity는 미리 정의된 작업을 수행합니다. 이러한 기능을 사용하려는 의도가 아닌 경우 이러한 이름을 사용해선 안 됩니다.

Name 예제 구문 기능
_TransparencyLM _TransparencyLM ("Transmissive Texture", 2D) = "white" {} 라이트매핑 동안 커스텀 RGB 투명도를 활성화합니다.

자세한 내용은 라이트매핑 및 셰이더를 참조하십시오.

머티리얼 프로퍼티 속성

머티리얼 프로퍼티 선언에는 Unity에게 처리 방법을 알려주는 선택적 속성이 있을 수 있습니다.

여기 나열된 속성 외에도 같은 구문을 사용하여 머티리얼 프로퍼티에 MaterialPropertyDrawer를 추가할 수 있습니다. 이러한 속성은 머티리얼 프로퍼티가 인스펙터 창에 어떻게 표시되는지를 제어합니다.

속성 기능
[Gamma] 플로트 또는 벡터 속성이 sRGB 값을 사용하며, 따라서 프로젝트의 색 공간이 요구하는 경우 다른 sRGB 값과 함께 변환되어야 함을 나타냅니다. 자세한 내용은 셰이더 프로그램의 프로퍼티를 참조하십시오.
[HDR] 텍스처 또는 컬러 프로퍼티가 고명암비(HDR) 값을 사용함을 나타냅니다.

텍스처 프로퍼티의 경우, LDR 텍스처가 할당되면 Unity 에디터가 경고를 표시합니다. 컬러 프로퍼티의 경우, Unity 에디터는 HDR 컬러 피커를 사용하여 이 값을 수정합니다.
[HideInInspector] Unity 에디터에게 인스펙터에서 이 프로퍼티를 숨길 것을 지시합니다.
[MainTexture] 머티리얼의 메인 텍스처를 설정합니다. 이 메인 텍스처는 Material.mainTexture를 사용하여 액세스할 수 있습니다.

기본적으로 Unity는 프로퍼티 이름이 _MainTex인 텍스처를 메인 텍스처로 간주합니다. 텍스처의 프로퍼티 이름이 다르지만 Unity가 이 텍스처를 메인 텍스처로 간주하게 하려면 이 속성을 사용하십시오.

이 속성을 두 번 이상 사용하면 Unity는 첫 번째 프로퍼티를 사용하며 이후의 프로퍼티는 무시합니다.

참고: 이 속성을 사용하여 메인 텍스처를 설정하는 경우, 텍스처 스트리밍 디버깅 뷰 모드 또는 커스텀 디버그 툴을 사용하면 이 텍스처가 게임 뷰에서 보이지 않습니다.
[MainColor] 머티리얼의 메인 컬러를 설정합니다. 이 메인 컬러는 Material.color를 사용하여 액세스할 수 있습니다.

기본적으로 Unity는 프로퍼티 이름이 _Color인 컬러를 메인 컬러로 간주합니다. 컬러의 프로퍼티 이름이 다르지만 Unity가 이 컬러를 메인 컬러로 간주하게 하려면 이 속성을 사용하십시오. 이 속성을 두 번 이상 사용하면 Unity는 첫 번째 프로퍼티를 사용하며 이후의 프로퍼티는 무시합니다.
[NoScaleOffset] Unity 에디터에게 이 텍스처 프로퍼티의 타일링과 오프셋 필드를 숨기도록 지시합니다.
[Normal] 텍스처 프로퍼티가 노멀 맵을 기대함을 나타냅니다.

호환되지 않는 텍스처를 할당하면 Unity 에디터가 경고를 표시합니다.
[PerRendererData] 텍스처 프로퍼티가 렌더러별 데이터에서 MaterialPropertyBlock 형태로 나올 것임을 나타냅니다.

머티리얼 인스펙터는 이러한 속성을 읽기 전용으로 표시합니다.

C# 코드와 함께 머티리얼 프로퍼티 사용

C# 코드에서 머티리얼 프로퍼티는 MaterialProperty 클래스로 표시됩니다.

HLSL 코드에 정의된 변수에 액세스하려면 Material.GetFloat, Material.SetFloat를 호출하면 됩니다. 다른 유사한 메서드의 리스트는 머티리얼 API 문서를 참조하십시오. 이러한 API를 사용하여 HLSL 변수에 액세스하는 경우에는 변수가 머티리얼 프로퍼티인지 여부가 상관이 없습니다.

Unity 에디터에서는 인스펙터 창에 머티리얼 프로퍼티가 표시되는 방식을 제어할 수 있습니다. 가장 쉬운 방법은 MaterialPropertyDrawer를 사용하는 것입니다. 보다 복잡한 구현이 필요한 경우 MaterialEditor, MaterialPropertyShaderGUI 클래스를 사용하면 됩니다. 셰이더를 위한 커스텀 GUI를 만드는 방법에 대한 내용은 ShaderLab: 커스텀 에디터 할당을 참조하십시오.

ShaderLab 코드에서 변수를 설정하기 위해 머티리얼 프로퍼티 사용

머티리얼 프로퍼티에서 ShaderLab 코드의 변수 값을 설정하려면 ShaderLab 코드에서 머티리얼 프로퍼티 이름을 대괄호 안에 넣으십시오.

이 예제 코드는 머티리얼 프로퍼티를 사용하여 ShaderLab Offset 커맨드의 units 값을 설정하는 구문을 나타냅니다.

Shader "Examples/MaterialPropertyShaderLab"
{
    Properties
    {
        // Change this value in the Material Inspector to affect the value of the Offset command
        _OffsetUnitScale ("Offset unit scale", Integer) = 1
    }
    SubShader
    {
        // The code that defines the rest of the SubShader goes here

        Pass
        {
            Offset 0, [_OffsetUnitScale]

           // The code that defines the rest of the Pass goes here
        }
    }
}

HLSL 코드에서 변수를 설정하기 위해 머티리얼 프로퍼티 사용

HLSL 코드에서 머티리얼 프로퍼티를 사용하여 변수 값을 설정하려면 머티리얼 프로퍼티에 셰이더 프로퍼티와 같은 이름을 지정하십시오.

실제 작동하는 코드 예제가 포함된 다음 문서에서 이 기법을 확인할 수 있습니다.

ShaderLab: 셰이더 오브젝트 정의
ShaderLab: 폴백 할당