ShaderLab 셰이더는 “하드웨어 셰이더” 외에도 넓은 범위를 포괄하며, 다양한 기능을 수행합니다. 머티리얼 인스펙터에 표시되는 프로퍼티를 설명하고, 서로 다른 그래픽 하드웨어용셰이더를 여러 개 구현하며, 고정 함수 하드웨어 상태를 설정합니다. 버텍스 및 프래그먼트 프로그램과 같은 실제 프로그래밍 가능 셰이더는 ShaderLab 전체의 “셰이더” 개념의 일부일 뿐입니다. 기본 개요는 셰이더 튜토리얼을 참조하십시오. 여기에서 로우 레벨 하드웨어 셰이더를 shader programs 라고 합니다.
If you want to write shaders that interact with lighting, take a look at Surface Shaders documentation. For some examples, take a look at Vertex and Fragment Shader Examples. The rest of this page will assume shaders that do not interact with Unity lights (e.g. special effects, Image Effects etc.)
Shader programs are written in Cg/HLSL language, by embedding “snippets” in the shader text, somewhere inside the Pass command. They usually look like this:
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 ...
}
Cg/HLSL program snippets are written between CGPROGRAM and ENDCG.
스니핏의 시작 부분에 #pragma 명령문을 사용하여 컴파일 지시문을 명시할 수 있습니다. 지시문은 어느 셰이더 함수를 컴파일해야 할지 나타냅니다.
기타 컴파일 지시문:
각 스니핏은 최소한 하나의 버텍스 프로그램과 하나의 프래그먼트 프로그램을 포함해야 합니다. 따라서 #pragma vertex 및 #pragma fragment 지시문이 필요합니다.
다음 컴파일 지시문은 Unity 5.0부터는 아무 동작도 하지 않으며 따라서 안전하게 제거할 수 있습니다. #pragma glsl
, #pragma glsl_no_auto_normalization
, #pragma profileoption
, #pragma fragmentoption
.
Unity supports several rendering APIs (e.g. Direct3D 9 and OpenGL), and by default all shader programs are compiled into all supported renderers. You can indicate which renderers to compile to using #pragma only_renderers or #pragma exclude_renderers directives. This is mostly useful in cases where you are explicitly using some shader language features that you know aren’t possible on some platforms. Currently supported renderer names are:
예를 들어, 다음 라인은 셰이더를 D3D9 모드로만 컴파일합니다.
#pragma only_renderers d3d9