Unity 쉐이더 프로퍼티 액세스 가이드
이 문서는 Unity의 쉐이더 프로퍼티 액세스를 설명하고 다양한 활용 예제를 제공합니다. Unity에서의 셰이더 프로퍼티는 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; // 색상에 대한 저정밀도 타입
float4 _MyVector;
float _MyFloat;
sampler2D _MyTexture;
samplerCUBE _MyCubemap;
프로퍼티 값의 제공 경로
쉐이더 프로퍼티 값은 다음의 위치에서 제공됩니다:
MaterialPropertyBlock에 설정된 값 (인스턴스당 데이터)- 렌더링된 오브젝트에 사용되는 머티리얼의 값
- 글로벌 셰이더 프로퍼티 값
우선순위는 인스턴스당 데이터 > 머티리얼 데이터 > 글로벌 프로퍼티입니다.
직렬화 및 런타임 프로퍼티
머티리얼은 직렬화된 프로퍼티와 런타임에서 설정된 프로퍼티 값을 모두 가질 수 있습니다:
- 직렬화 데이터: 셰이더 프로퍼티가 정의된 모든 프로퍼티
- 런타임 프로퍼티:
Material.SetColor와 같이 스크립트를 통해 설정된 프로퍼티
특수 텍스처 프로퍼티
Unity는 각 텍스처 프로퍼티에 대해 추가 벡터 프로퍼티를 설정합니다:
- 타일링 및 오프셋:
float4{TextureName}_ST프로퍼티에서 전달됩니다. - 텍스처 크기:
{TextureName}_TexelSize에서 텍스처의 크기 정보를 제공합니다. - HDR 파라미터:
{TextureName}_HDR에서 HDR 텍스처의 디코딩 방식 정보가 담겨 있습니다.
색 공간 및 컬러/벡터 데이터
리니어 색 공간을 사용할 경우, 모든 머티리얼 컬러 프로퍼티는 sRGB 컬러로 공급되지만 리니어 값으로 전환됩니다. 플로트나 벡터 타입 프로퍼티는 색 변환이 없고, 색으로 간주되지 않습니다.
활용 예제
예제 1: 프로퍼티 설정 및 사용
Material myMaterial;
myMaterial.SetColor("_MyColor", Color.red);
예제 2: 타일링과 오프셋 적용
myMaterial.SetTexture("_MyTexture", myTexture);
myMaterial.SetVector("_MyTexture_ST", new Vector4(2.0f, 2.0f, 0.5f, 0.5f));
결론
이 문서는 Unity에서 셰이더 프로퍼티를 정의하고 접근하는 방법을 설명했습니다. 쉐이더 프로퍼티는 다양한 비주얼적 요소를 제어하는 데 중요한 역할을 하므로, 이를 잘 활용하여 더욱 풍부한 게임 개발이 가능하길 바랍니다.