셰이더 시맨틱(Shader semantics)
버텍스 프로그램에 버텍스 데이터 제공하기(Providing vertex data to vertex programs)

Cg/HLSL에서 셰이더 프로퍼티 액세스(Accessing shader properties in Cg/HLSL)

셰이더는 프로퍼티 블록에서 머티리얼 프로퍼티를 선언합니다. 셰이더 프로그램에서 일부 프로퍼티에 액세스하려는 경우 동일한 이름과 매칭 타입으로 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 변수 타입에 배치될 수 있습니다.

  • 컬러와 벡터 프로퍼티는 float4, half4 또는 fixed4 변수에 배치됩니다.
  • 범위와 플로트 프로퍼티는 float, half 또는 fixed 변수에 배치됩니다.
  • 일반 (2D) 텍스처용 텍스처 프로퍼티는 sampler2D 변수에 배치되며, 큐브맵은 samplerCUBE 에, 3D 텍스처는 sampler3D 에 배치됩니다.

프로퍼티 값이 셰이더에 제공되는 방법

셰이더 프로퍼티 값은 다음 위치에서 발견되고 셰이더에 제공됩니다.

  • MaterialPropertyBlock에 설정된 렌더러당 값입니다. 일반적으로 “인스턴스당” 데이터입니다(예: 같은 머티리얼을 공유하는 수많은 오브젝트용 사용자 정의 틴트 컬러).
  • 렌더링된 오브젝트에 사용되는 머티리얼에 설정된 값입니다.
  • 글로벌 셰이더 프로퍼티로 Unity 렌더링 코드 자체에 설정되거나(빌트인 셰이더 변수)(SL-UnityShaderVariables)를 참조), 자체 스크립트(예: Shader.SetGlobalTexture)에서 설정됩니다.

우선순위는 위와 같습니다. 인스턴스당 데이터는 모든 것을 오버라이드하고, 머티리얼 데이터가 사용되며, 마지막으로 셰이더 프로퍼티가 두 위치에 존재하지 않는 경우 글로벌 프로퍼티 값을 사용합니다. 정의된 셰이더 프로퍼티 값이 어디에도 존재하지 않는 경우 “기본값”(플로트는 0, 컬러는 검은색, 텍스처는 빈 흰색 텍스처)이 제공됩니다.

직렬화 및 런타임 머티리얼(Runtime Material) 프로퍼티

머티리얼은 직렬화 및 런타임에서 설정한 프로퍼티 값을 모두 포함할 수 있습니다.

직렬화 데이터는 셰이더 프로퍼티에 정의된 모든 프로퍼티입니다. 보통은 머티리얼에 저장되어야 하며 머티리얼 인스펙터에서 사용자가 수정 가능합니다.

머티리얼은 셰이더가 사용하는 일부 프로퍼티를 보유할 수 있지만 셰이더 프로퍼티 블록에 선언되지 않습니다. 보통은 런타임 시점에 스크립트 코드로부터, 설정된 프로퍼티로 예를 들면 Material.SetColor를 경유하여 설정된 프로퍼티입니다. 매트릭스 및 배열은(프로퍼티 블록에 정의할 수 없기 때문에) 직렬화되지 않은 런타임 프로퍼티로만 존재할 수 있습니다.

특수 텍스처(Texture) 프로퍼티

셰이더/머티리얼 프로퍼티로 설정된 각 텍스처 프로퍼티에 대해서 Unity는 추가 벡터 프로퍼티에 일부 추가 정보를 설정합니다.

텍스처(Texture) 타일링 및 오프셋

머티리얼은 종종 텍스처 프로퍼티용 타일링 및 모프셋 필드를 보유합니다. 이 정보는 float4 {TextureName}_ST 프로퍼티에서 셰이더로 전달됩니다.

  • x는 X 타일링 값을 포함합니다.
  • y는 Y 타일링 값을 포함합니다.
  • z는 X 오프셋 값을 포함합니다.
  • w는 Y 오프셋 값을 포함합니다.

예를 들어 셰이더가 _MainTex라는 이름의 텍스처를 포함하는 경우 타일링 정보는 _MainTex_ST 벡터에 저장됩니다.

텍스처(Texture) 크기

{TextureName}_TexelSize - float4 프로퍼티에는 텍스처 크기 정보가 포함됩니다.

  • x는 1.0/너비를 포함합니다.
  • y는 1.0/높이를 포함합니다.
  • z는 너비를 포함합니다.
  • w는 높이를 포함합니다.

텍스처(Texture) HDR 파라미터

{TextureName}_HDR - 사용되는 색 공간에 따라 HDR(예: RGBM으로 인코딩된) 텍스처를 잠재적으로 어떻게 디코딩할지에 대한 정보를 포함한 float4 프로퍼티입니다. UnityCG.cginc 셰이더 포함 파일에서 DecodeHDR 함수를 참조하십시오.

색 공간 및 컬러/벡터 셰이더 데이터

리니어 색 공간을 사용할 때 모든 머티리얼 컬러 프로퍼티는 sRGB 컬러로 공급되지만 셰이더로 전달될 때 리니어 값으로 전환됩니다.

예를 들어, 프로퍼티 셰이더 블록이 “MyColor“라는 Color 프로퍼티를 포함하는 경우 상응하는 ”MyColor” HLSL 변수가 리니어 컬러 값을 획득합니다.

Float 또는 Vector 타입으로 마크된 프로퍼티에는 기본적으로 색 공간 변환이 이뤄지지 않으며 컬러가 아닌 데이터를 포함하는 것으로 간주됩니다. 컬러처럼 sRGB 공간에서 지정됨을 나타내는 플로트/벡터 프로퍼티용 [Gamma] 속성을 추가할 수 있습니다. 프로퍼티를 참조하십시오.

참고 항목

셰이더 시맨틱(Shader semantics)
버텍스 프로그램에 버텍스 데이터 제공하기(Providing vertex data to vertex programs)