ShaderLab 셰이더는 “하드웨어 셰이더” 외에도 넓은 범위를 포괄하며, 다양한 기능을 수행합니다. 머티리얼 인스펙터에 표시되는 프로퍼티를 설명하고, 서로 다른 그래픽 하드웨어용셰이더를 여러 개 구현하며, 고정 함수 하드웨어 상태를 설정합니다. 버텍스 및 프래그먼트 프로그램과 같은 실제 프로그래밍 가능 셰이더는 ShaderLab 전체의 “셰이더” 개념의 일부일 뿐입니다. 기본 개요는 셰이더 튜토리얼을 참조하십시오. 여기에서 로우 레벨 하드웨어 셰이더를 shader programs 라고 합니다.
**조명과 상호작용하는 셰이더를 작성하려면 표면 셰이더 문서를 참고하십시오. 버텍스 및 프래그먼트 셰이더 예제에서는 예제를 확인할 수 있습니다. 이 페이지에서는 셰이더가 Unity 광원과 상호작용하지 않는다고 가정합니다(예를 들어 특수 효과, 포스트 프로세싱 효과 등)
셰이더 프로그램은 HLSL 언어로, 패스 커맨드 내부에서 셰이더 텍스트에 “스니핏”을 임베드하여 작성합니다. 보통 예제는 다음과 같습니다.
Pass {
// ... the usual pass state setup ...
CGPROGRAM
// compilation directives for this snippet, e.g.:
#pragma vertex vert
#pragma fragment frag
// the Cg/HLSL code itself
ENDCG
// ... the rest of pass setup ...
}
HLSL 프로그램 스니핏은 CGPROGRAM 및 ENDCG 키워드 사이, 또는 HLSLPROGRAM 및 ENDHLSL 사이에 작성됩니다. 후자는 자동으로 HLSLSupport와 UnityShaderVariables 빌트인 헤더 파일을 포함하지 않습니다.
스니핏의 시작 부분에 #pragma 명령문을 사용하여 컴파일 지시문을 명시할 수 있습니다. 지시문은 어느 셰이더 함수를 컴파일해야 할지 나타냅니다.
기타 컴파일 지시문:
각 스니핏은 최소한 하나의 버텍스 프로그램과 하나의 프래그먼트 프로그램을 포함해야 합니다. 따라서 #pragma vertex 및 #pragma fragment 지시문이 필요합니다.
다음 컴파일 지시문은 Unity 5.0부터는 아무 동작도 하지 않으며 따라서 안전하게 제거할 수 있습니다. #pragma glsl
, #pragma glsl_no_auto_normalization
, #pragma profileoption
, #pragma fragmentoption
.
Unity는 여러 렌더링 API(Direct3D 11 및 OpenGL 등)를 지원하며 기본적으로 모든 셰이더 프로그램은 모든 지원 가능 렌더러로 컴파일됩니다. 어느 렌더러를 컴파일할지는 #pragma only_renderers 또는 #pragma exclude_renderers 지시문을 사용하여 지정할 수 있습니다. 특히 일부 플랫폼에서는 사용할 수 없는 일부 셰이더 언어 기능을 명시적으로 사용하고자 하는 경우에 유용합니다. 지원하는 렌더러 이름은 다음과 같습니다.
예를 들어, 다음 라인은 셰이더를 D3D11 모드로만 컴파일합니다.
#pragma only_renderers d3d11