셰이더는 그래픽 카드 실행 코드와 명령을 가진 에셋입니다. Materials는 셰이더를 참조하며 (텍스처나 컬러 등) 파라미터를 설정합니다.
Unity에는 프로젝트에서 언제든 사용할 수 있는 몇 가지 빌트인 셰이더가 있습니다. (예: 스탠다드 셰이더). 또한 셰이더를 직접 작성하고 포스트 프로세싱 효과를 적용할 수 있습니다.
새로운 셰이더를 만들려면 메인 메뉴에서 Assets->Create->Shader__를 사용하거나 컨텍스트 메뉴의 Project View__ 사용해야 합니다. 셰이더는 텍스트 파일로 C# 스크립트와 유사하며 Cg/HLSL과 ShaderLab 언어를 조합해 작성됩니다. (자세한 내용은 셰이더 작성 페이지를 참조하십시오).
인스펙터 섹션에서는 셰이더의 기본 텍스처를 지정합니다. 새로운 Material이 셰이더로 생성될 때마다 텍스처가 자동으로 할당됩니다.
셰이더 인스펙터는 셰이더에 대한 기본 정보를 나타내며 (대부분 셰이더 태그) 로우 레벨의 컴파일 코드를 컴파일하고 조사합니다.
표면 셰이더의 Show generated code 버튼은 Unity가 조명과 그림자를 처리하기 위해 생성한 모든 코드를 나타냅니다. 생성된 코드를 커스터마이즈하려는 경우엔 전부를 원본 셰이더 파일에 복사하여 붙여넣으면 수정하기 시작합니다.
Compile and show code 버튼의 팝업 메뉴는 최종 컴파일된 셰이더 코드(예: Direct3D9의 어셈블리나 OpenGL ES용 로우 레벨로 최적화된 GLSL)를 선택한 플랫폼으로 검토하게 합니다. 이는 셰이더의 퍼포먼스를 최적화할 때 대체로 유용합니다. 때때로 로우 레벨의 여러 명령이 최종적으로 어떻게 생성됐는지를 알고 싶은 경우가 있습니다.
로우 레벨로 생성된 코드는 GPU 셰이더 퍼포먼스 분석 툴에 붙여넣는 데 유용합니다. (예: AMD GPU ShaderAnalyzer 또는 PVRShaderEditor).
Unity는 셰이더를 임포트할 때, 전체 셰이더를 컴파일하지 않습니다. 왜냐하면 대다수의 셰이더가 내부에 다수의 배리언트를 가지고 있어 가능한 모든 플랫폼으로 전부 컴파일하면 시간이 상당히 오래 걸리기 때문입니다. 대신 다음과 같은 방법을 취합니다.
플레이어 빌드 시에는 “아직 컴파일되지 않은” 모든 셰이더 배리언트가 컴파일되므로 이러한 배리언트들이 에디터가 사용하지 않았어도 게임 데이터에 포함됩니다.
이는 곧 셰이더를 가져올 때 미처 감지되지 않은 오류가 포함돼 있을 가능성을 시사합니다. 예를 들어 Direct3D 11로 에디터를 실행하고 있는데 셰이더가 OpenGL용으로 컴파일된 오류가 있다거나 셰이더의 일부 배리언트가 셰이더 모델 2.0 명령 한계에 맞지 않는 경우 등이 있습니다. 이런 오류는 에디터에 필요한 경우 인스펙터에 표시합니다. 하지만 필요한 플랫폼에 셰이더를 수동으로 완전히 컴파일해 오류를 확인하는 습관을 들여놓으면 좋습니다. 셰이더 인스펙터의 Compile and show code 팝업 메뉴를 사용하면 이렇게 할 수 있습니다.
셰이더 컴파일은 UnityShaderCompiler
라는 백그라운드 프로세스를 사용하는데 이는 Unity가
컴파일 셰이더를 필요로 할 때마다 시작됩니다. 다수의 컴파일 프로세스가 시작될 수 있어 (보통
컴퓨터의 CPU 코어당 하나) 플레이어 빌드 시에 셰이더 컴파일이 동시에 진행될 수 있습니다.
에디터는 셰이더를 컴파일하지 않고 컴파일러 프로세스는 아무 일도 하지 않으며 컴퓨터 리소스를 소비하지 않으니
걱정할 필요는 없습니다. Unity 에디터를 끝내면 이러한 프로세스 역시 마찬가지로 종료됩니다.
각각의 셰이더 배리언트 컴파일 결과는 프로젝트의 Library/ShaderCache
폴더에 캐시됩니다.
이는 100% 동일한 셰이더나 스니핏이 이전에 컴파일된 결과를 재사용함을 뜻합니다. 또한
자주 변경되는 셰이더가 많으면 셰이더 캐시 폴더가 상당히 커질 수 있음을 의미합니다.
그러므로 이는 제거하는 것이 항상 안전합니다. 셰이더 배리언트 재컴파일을 야기하기 때문입니다.