ShaderLab 구문(ShaderLab Syntax)
ShaderLab: 서브셰이더(SubShader)

ShaderLab: 프로퍼티(Properties)

셰이더는 Unity의 머티리얼 인스펙터에서 아티스트의 설정을 위한 파라미터 리스트를 정의할 수 있습니다. 셰이더 파일의 프로퍼티 블록이 이를 정의합니다.

구문

프로퍼티

Properties { Property [Property ...] }

프로퍼티 블록을 정의합니다. 중괄호 안에 다음과 같이 여러 프로퍼티를 정의합니다.

숫자(Numbers) 및 슬라이더(Sliders)

name ("display name", Range (min, max)) = number
name ("display name", Float) = number
name ("display name", Int) = number

모두 디폴트로 숫자(스칼라) 프로퍼티를 정의합니다. Range 형식은 최소, 최대 범위 사이에서 슬라이더로 표시됩니다.

컬러(Colors) 및 벡터(Vectors)

name ("display name", Color) = (number,number,number,number)
name ("display name", Vector) = (number,number,number,number)

주어진 RGBA 컴포넌트 또는 4D 벡터 프로퍼티의 디폴트로 컬러 프로퍼티를 정의합니다. 컬러 프로퍼티에는 컬러 피커가 표시되며 필요한 색 공간에 따라서 조절됩니다. 셰이더 프로그램 프로퍼티를 참조하십시오. 벡터 프로퍼티는 숫자 필드 4개로 표시됩니다.

텍스처(Textures)

name ("display name", 2D) = "defaulttexture" {}
name ("display name", Cube) = "defaulttexture" {}
name ("display name", 3D) = "defaulttexture" {}

각각 2D 텍스처, 큐브맵, 3D(영역) 프로퍼티를 정의합니다.

세부 정보

셰이더에서 각 프로퍼티는 name으로 참조됩니다. Unity에서는 밑줄 표시로 셰이더 프로퍼티 이름을 시작하는 것이 일반적입니다. 프로퍼티는 머티리얼 인스펙터에서 display name으로 나타납니다. 각 프로퍼티에서 디폴트는 등호 뒤에 부여됩니다.

  • RangeFloat 프로퍼티에서는 “13.37”과 같은 단일 숫자입니다.
  • ColorVector 프로퍼티에서는 “(1,0.5,0.2,1)”와 같은 괄호 속 숫자 4개입니다.
  • 2D 텍스처에서 디폴트는 빈 문자열 또는 다음과 같은 빌트인 기본 텍스처 중 하나입니다. “white” (RGBA: 1,1,1,1), “black” (RGBA: 0,0,0,0), “gray” (RGBA: 0.5,0.5,0.5,0.5), “bump” (RGBA: 0.5,0.5,1,0.5) or “red” (RGBA: 1,0,0,0)
  • 2D가 아닌 텍스처(큐브, 3D, 2D 배열)에서 디폴트는 빈 문자열입니다. 머티리얼에 큐브맵/3D/배열 텍스처가 할당돼있지 않으면 회색(RGBA: 0.5,0.5,0.5,0.5)이 사용됩니다.

차후 셰이더의 고정 함수 파트에서 프로퍼티 값은 대괄호 프로퍼티 이름을 사용하여 액세스될 수 있습니다([name]). 예를 들어, 머티리얼 프로퍼티로부터 두 정수 프로퍼티(“SrcBlend“, ”DstBlend”)를 선언하여 블렌딩 모드를 구동할 수 있으며, 차후 Blend 커맨드가 이것을 사용하도록 할 수 있습니다(Blend [_SrcBlend] [_DstBlend]).

프로퍼 블록에 존재하는 셰이더 파라미터는 머티리얼 데이터로 직렬화됩니다. 셰이더 프로그램은 실제로 런타임의 코드로부터 머티리얼에 설정된 더 많은 파라미터 (매트릭스, 벡터, 플로트)를 보유할 수 있지만 프로퍼티 블록의 일부가 아닌 경우 이 값은 저장되지 않습니다. 이것은 완전히 스크립트 코드 기반이며 (Material.SetFloat를 사용) 유사한 함수인 값에 대체로 유용합니다.

프로퍼티 속성 및 드로어

모든 프로퍼티 앞 대괄호 안에는 선택적 속성을 지정할 수 있습니다. Unity에서 인식되는 속성이나 머티리얼 인스펙터에서 어떻게 렌더링돼야 하는지 제어하기 위한 자체적인 MaterialPropertyDrawer classes를 나타낼 수 있습니다. Unity에서 인식되는 속성은 다음과 같습니다.

  • [HideInInspector] - 머티리얼 인스펙터에 프로퍼티 값을 표시하지 않습니다.
  • [NoScaleOffset] - 머티리얼 인스펙터는 이 속성을 포함한 텍스처 프로퍼티에 대해 텍스처 타일링/오프셋 필드를 표시하지 않습니다.
  • [Normal] - 텍스처 프로퍼티의 노멀맵 예상 여부를 나타냅니다.
  • [HDR] - 텍스처 프로퍼티의 HDR 텍스처 예상 여부를 나타냅니다.
  • [Gamma] - 플로트/벡터 프로퍼티가 UI에서 sRGB로 지정되고(컬러와 동일) 사용되는 색 공간에 따라 변환이 필요할 수도 있음을 나타냅니다. 셰이더 프로그램 프로퍼티를 참조하십시오.
  • [PerRendererData] - 텍스처 프로퍼티가 MaterialPropertyBlock의 형태로 렌더러당 데이터에서 생성됨을 나타냅니다. 머티리얼 인스펙터는 프로퍼티용 텍스처 슬롯 UI를 변경합니다.

예제

// properties for a water shader
Properties
{
    _WaveScale ("Wave scale", Range (0.02,0.15)) = 0.07 // sliders
    _ReflDistort ("Reflection distort", Range (0,1.5)) = 0.5
    _RefrDistort ("Refraction distort", Range (0,1.5)) = 0.4
    _RefrColor ("Refraction color", Color) = (.34, .85, .92, 1) // color
    _ReflectionTex ("Environment Reflection", 2D) = "" {} // textures
    _RefractionTex ("Environment Refraction", 2D) = "" {}
    _Fresnel ("Fresnel (A) ", 2D) = "" {}
    _BumpMap ("Bumpmap (RGB) ", 2D) = "" {}
}

텍스처(Texture) 프로퍼티 옵션(5.0버전에서 제거됨)

Unity 5 이전에 텍스처 프로퍼티는 중괄호 블록 내에 TexGen CubeReflect과 같은 옵션을 보유할 수 있었습니다. 이것은 고정 함수 텍스처 좌표 생성을 제어했습니다. 이 기능은 5.0 버전에서 제거됐습니다. TexGen이 필요한 경우 대신 버텍스 셰이더를 사용해야 합니다. 예제는 고정 함수 TexGen 구현 페이지를 참조하십시오.

참고 항목

ShaderLab 구문(ShaderLab Syntax)
ShaderLab: 서브셰이더(SubShader)