Unity에서 셰이더는 다음 세 가지 방법 중 하나로 작성할 수 있습니다.
표면 셰이더는 셰이더가 광원 및 섀도우에 의해 영향을 받아야 하는 경우 최고의 선택입니다. 표면 셰이더는 Unity의 조명 파이프라인과 상호작용을 위한 고수준의 추상화로 복잡한 셰이더를 간편하게 작성할 수 있습니다. 대부분의 표면 셰이더는 포워드 및 디퍼드 라이팅 모두를 자동으로 지원합니다. 표면 셰이더는 몇 줄의 Cg/HLSL로 작성할 수 있으며, 여기에서부터 더 많은 코드가 자동으로 생성됩니다.
셰이더가 광원의 영향을 받지 않는다면 표면 셰이더를 사용하지 않습니다. 포스트 프로세싱 효과 또는 여러 특수 효과 셰이더의 경우 표면 셰이더는 아무 이유 없이 다수의 조명을 계산하므로 차선책으로 사용합니다.
버텍스 및 프래그먼트 셰이더는 셰이더가 조명과 상호작용할 필요가 없거나 표면 셰이더로 다룰 수 없는 일부 색다른 효과가 필요한 경우 사용합니다. 이 방법으로 작성된 셰이더 프로그램은 필요한 효과를 생성하는 가장 유연한 방법이지만(심지어 표면 셰이더도 수많은 버텍스 및 프래그먼트 셰이더로 자동으로 전환됨) 상대적인 비용이 따릅니다. 많은 코드를 작성해야 하며 조명과 상호작용하도록 만들기가 더 어렵습니다. 이 셰이더도 역시 Cg/HLSL로 작성됩니다.
고정 함수 셰이더는 매우 단순한 효과용 레거시 셰이더입니다. 훨씬 더 유연하게 사용할 수 있으므로 프로그래밍 가능한 셰이더로 작성할 것을 권장합니다. 고정 함수 셰이더는 전적으로 ShaderLab이라고 하는 언어로 작성되며 Microsoft의 .FX 파일 또는 NVIDIA의 CgFX와 유사합니다. 내부적으로 모든 고정 함수 셰이더는 셰이더 임포트 시 버텍스 및 프래그먼트 셰이더로 전환됩니다.
어떤 타입을 선택하는지 관계없이 실제 셰이더 코드는 항상 ShaderLab에서 래핑되며 셰이더 구조를 구성하는 데 사용됩니다. 다음과 유사하게 보입니다.
Shader "MyShader" {
Properties {
_MyTexture ("My Texture", 2D) = "white" { }
// Place other properties like colors or vectors here as well
}
SubShader {
// here goes your
// - Surface Shader or
// - Vertex and Fragment Shader or
// - Fixed Function Shader
}
SubShader {
// Place a simpler "fallback" version of the SubShader above
// that can run on older graphics cards here
}
}
먼저 ShaderLab 레퍼런스 페이지에서 ShaderLab 구문의 기본 개념을 읽어보고 아래 나열된 튜토리얼을 진행할 것을 권장합니다.
튜토리얼에서 다양한 유형의 셰이더에 대한 예를 확인할 수 있습니다. Unity의 포스트 프로세싱 효과를 참고하여 셰이더로 흥미로운 효과를 만들 수 있습니다.
계속해서 셰이더에 대한 소개를 읽고 셰이더 레퍼런스 페이지를 확인합니다!