Unity의 모든 셰이더 파일은 “ShaderLab”이라는 선언형 언어로 작성되어 있습니다. 이 파일에서 중첩 중괄호 구문은 머티리얼 인스펙터에 표시할 셰이더 프로퍼티, 수행할 하드웨어 폴백 종류, 사용할 블렌딩 모드 등 셰이더를 묘사하는 다양한 사항을 선언합니다. 실제 셰이더 코드는 동일한 셰이더 파일 내에 CGPROGRAM
스니핏(코드 조각)으로 작성됩니다. 자세한 내용은 표면 셰이더 작성과 버텍스 및 프래그먼트 셰이더 작성을 참조하십시오.
이 페이지와 하위 페이지에서는 중첩 중괄호 “ShaderLab” 구문을 기술합니다. CGPROGRAM
스니핏은 표준 HLSL/Cg 셰이딩 언어로 작성되어 있습니다.
각 문서 페이지를 참조하십시오.
Shader 는 셰이더 파일의 루트 커맨드입니다. 각 파일은 반드시 단 하나의 셰이더만을 정의해야 합니다. 이 파일은 셰이더를 사용하는 머티리얼이 있는 오브젝트가 어떻게 렌더될지를 명시합니다.
Shader "name" { [Properties] Subshaders [Fallback] [CustomEditor] }
셰이더를 정의합니다. 이 셰이더는 머티리얼 인스펙터에서 name이라는 항목으로 표시됩니다. 머티리얼 인스펙터에 나타날 properties 리스트를 정의하는 옵션도 있습니다. 다음으로 SubShaders 리스트가 나오며 옵션으로 폴백 및/또는 커스텀 에디터 선언이 나오게 됩니다.
셰이더에는 프로퍼티 리스트가 존재할 수 있습니다. 셰이더에 선언된 모든 프로퍼티는 Unity의 머티리얼 인스펙터에 표시됩니다. 대표적인 프로퍼티로 오브젝트 컬러, 텍스처, 또는 셰이더가 사용하는 임의의 값 등이 있습니다.
각 셰이더는 서브셰이더의 리스트로 구성됩니다. 최소한 하나의 서브셰이더가 있어야 합니다. Unity는 셰이더를 로드할 때 서브셰이더의 리스트를 살펴보고 최종 사용자의 기기가 지원하는 셰이더 리스트 중 가장 위에 있는 것을 선택합니다. 만약 지원되는 서브셰이더가 없으면 Unity는 폴백 셰이더 사용을 시도합니다.
그래픽 카드의 성능은 제품에 따라 다릅니다. 이 점이 게임 개발자에게 영원한 문제를 안겨줍니다. 최신 하드웨어에서 훌륭한 그래픽을 보여주는 게임을 만들고 싶지만 전체 인구의 3%만이 즐길 수 있는 게임이 되는 것은 원하지 않기 때문입니다. 그렇기 때문에 서브셰이더가 있습니다. 꿈꾸어 왔던 화려한 그래픽 효과를 모두 포함하는 서브셰이더를 하나 만들고나서 구형 그래픽카드용 서브셰이더를 더 추가해야 합니다. 이 서브셰이더는 개발자가 의도한 효과를 좀 더 느린 방법으로 구현할 수도, 일부 디테일을 구현하지 않을 수도 있습니다.
서브셰이더에 더해 사용할 수 있는 기법으로 셰이더 “정밀도 수준”(level of detail, LOD) 및 “셰이더 대체” 두 가지가 있습니다. 자세한 내용은 셰이더 정밀도 수준 및 셰이더 대체를 참조하십시오.
다음은 가장 간단한 셰이더 중 하나입니다.
// colored vertex lighting
Shader "Simple colored lighting"
{
// a single color property
Properties {
_Color ("Main Color", Color) = (1,.5,.5,1)
}
// define one subshader
SubShader
{
// a single pass in our subshader
Pass
{
// use fixed function per-vertex lighting
Material
{
Diffuse [_Color]
}
Lighting On
}
}
}
셰이더는 컬러 프로퍼티 \Color_ 를 정의하며(머티리얼 인스펙터에서 Main Color 로 표시), 디폴트를 (1,0.5,0.5,1)__ 로 지정합니다. 다음으로 하나의 서브셰이더를 정의합니다. 이 서브셰이더는 고정 함수 버텍스 라이팅을 켜고 이를 위한 기본 머티리얼을 설정하는 하나의 패스로 구성되어 있습니다.
더 복잡한 예제는 표면 셰이더 예제 또는 버텍스 및 프래그먼트 셰이더 예제를 참조하십시오.