Unity에서 셰이더는 다음 세 가지 방법 중 하나로 작성할 수 있습니다.
표면 셰이더는 셰이더가 광원 및 섀도우에 의해 영향을 받아야 하는 경우 최고의 선택입니다. 표면 셰이더는 Unity의 조명 파이프라인과 상호작용을 위한 고수준의 추상화로 복잡한 셰이더를 간편하게 작성할 수 있습니다. 대부분의 표면 셰이더는 포워드 및 디퍼드 라이팅 모두를 자동으로 지원합니다. 표면 셰이더는 몇 줄의 Cg/HLSL로 작성할 수 있으며, 여기에서부터 더 많은 코드가 자동으로 생성됩니다.
Do not use Surface Shaders if your Shader is not doing anything with lights. For Image Effects or many special-effect Shaders, Surface Shaders are a suboptimal option, since they do a bunch of lighting calculations for no good reason.
버텍스 및 프래그먼트 셰이더는 셰이더가 조명과 상호작용할 필요가 없거나 표면 셰이더로 다룰 수 없는 일부 색다른 효과가 필요한 경우 사용합니다. 이 방법으로 작성된 셰이더 프로그램은 필요한 효과를 생성하는 가장 유연한 방법이지만(심지어 표면 셰이더도 수많은 버텍스 및 프래그먼트 셰이더로 자동으로 전환됨) 상대적인 비용이 따릅니다. 많은 코드를 작성해야 하며 조명과 상호작용하도록 만들기가 더 어렵습니다. 이 셰이더도 역시 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 구문의 기본 개념을 읽어보고 아래 나열된 튜토리얼을 진행할 것을 권장합니다.
The tutorials include plenty of examples for the different types of Shaders. Unity’s Image Effects package contains a lot of interesting vertex and fragment Shaders.
계속해서 셰이더에 대한 소개를 읽고 셰이더 레퍼런스 페이지를 확인합니다!