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)__ 로 지정합니다. 다음으로 하나의 서브셰이더를 정의합니다. 이 서브셰이더는 고정 함수 버텍스 라이팅을 켜고 이를 위한 기본 머티리얼을 설정하는 하나의 패스로 구성되어 있습니다.
더 복잡한 예제는 표면 셰이더 예제 또는 버텍스 및 프래그먼트 셰이더 예제를 참조하십시오.
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.