셰이더는 프로퍼티 블록에서 머티리얼 프로퍼티를 선언합니다. 셰이더 프로그램에서 일부 프로퍼티에 액세스하려는 경우 동일한 이름과 매칭 타입으로 Cg/HLSL 변수를 선언해야 합니다. 셰이더 튜토리얼: 버텍스 및 프래그먼트 프로그램에서 예제를 제공합니다.
예를 들어, 다음과 같은 셰이더 프로퍼티는
_MyColor ("Some Color", Color) = (1,1,1,1)
_MyVector ("Some Vector", Vector) = (0,0,0,0)
_MyFloat ("My float", Float) = 0.5
_MyTexture ("Texture", 2D) = "white" {}
_MyCubemap ("Cubemap", CUBE) = "" {}
Cg/HLSL에서 다음과 같이 액세스하기 위해 선언됩니다.
fixed4 _MyColor; // low precision type is usually enough for colors
float4 _MyVector;
float _MyFloat;
sampler2D _MyTexture;
samplerCUBE _MyCubemap;
Cg/HLSL은 uniform 키워드도 받아들일 수 있지만, 필수는 아닙니다.
uniform float4 _MyColor;
ShaderLab의 프로퍼티 타입은 다음과 같이 Cg/HLSL 변수 타입에 배치될 수 있습니다.
셰이더 프로퍼티 값은 다음 위치에서 발견되고 셰이더에 제공됩니다.
우선순위는 위와 같습니다. 인스턴스당 데이터는 모든 것을 오버라이드하고, 머티리얼 데이터가 사용되며, 마지막으로 셰이더 프로퍼티가 두 위치에 존재하지 않는 경우 글로벌 프로퍼티 값을 사용합니다. 정의된 셰이더 프로퍼티 값이 어디에도 존재하지 않는 경우 “기본값”(플로트는 0, 컬러는 검은색, 텍스처는 빈 흰색 텍스처)이 제공됩니다.
머티리얼은 직렬화 및 런타임에서 설정한 프로퍼티 값을 모두 포함할 수 있습니다.
직렬화 데이터는 셰이더 프로퍼티에 정의된 모든 프로퍼티입니다. 보통은 머티리얼에 저장되어야 하며 머티리얼 인스펙터에서 사용자가 수정 가능합니다.
머티리얼은 셰이더가 사용하는 일부 프로퍼티를 보유할 수 있지만 셰이더 프로퍼티 블록에 선언되지 않습니다. 보통은 런타임 시점에 스크립트 코드로부터, 설정된 프로퍼티로 예를 들면 Material.SetColor를 경유하여 설정된 프로퍼티입니다. 매트릭스 및 배열은(프로퍼티 블록에 정의할 수 없기 때문에) 직렬화되지 않은 런타임 프로퍼티로만 존재할 수 있습니다.
셰이더/머티리얼 프로퍼티로 설정된 각 텍스처 프로퍼티에 대해서 Unity는 추가 벡터 프로퍼티에 일부 추가 정보를 설정합니다.
머티리얼은 종종 텍스처 프로퍼티용 타일링 및 모프셋 필드를 보유합니다. 이 정보는 float4 {TextureName}_ST
프로퍼티에서 셰이더로 전달됩니다.
x
는 X 타일링 값을 포함합니다.y
는 Y 타일링 값을 포함합니다.z
는 X 오프셋 값을 포함합니다.w
는 Y 오프셋 값을 포함합니다.예를 들어 셰이더가 _MainTex
라는 이름의 텍스처를 포함하는 경우 타일링 정보는 _MainTex_ST
벡터에 저장됩니다.
{TextureName}_TexelSize
- float4 프로퍼티에는 텍스처 크기 정보가 포함됩니다.
x
는 1.0/너비를 포함합니다.y
는 1.0/높이를 포함합니다.z
는 너비를 포함합니다.w
는 높이를 포함합니다.{TextureName}_HDR
- 사용되는 색 공간에 따라 HDR(예: RGBM으로 인코딩된) 텍스처를 잠재적으로 어떻게 디코딩할지에 대한 정보를 포함한 float4 프로퍼티입니다. UnityCG.cginc 셰이더 포함 파일에서 DecodeHDR
함수를 참조하십시오.
리니어 색 공간을 사용할 때 모든 머티리얼 컬러 프로퍼티는 sRGB 컬러로 공급되지만 셰이더로 전달될 때 리니어 값으로 전환됩니다.
예를 들어, 프로퍼티 셰이더 블록이 “MyColor“라는 Color
프로퍼티를 포함하는 경우 상응하는 ”MyColor” HLSL 변수가 리니어 컬러 값을 획득합니다.
Float
또는 Vector
타입으로 마크된 프로퍼티에는 기본적으로 색 공간 변환이 이뤄지지 않으며 컬러가 아닌 데이터를 포함하는 것으로 간주됩니다. 컬러처럼 sRGB 공간에서 지정됨을 나타내는 플로트/벡터 프로퍼티용 [Gamma]
속성을 추가할 수 있습니다. 프로퍼티를 참조하십시오.