빌트인 렌더 파이프라인에서 표면 셰이더를 작성할 때 사용자가 표면의 프로퍼티(알베도 컬러 및 노멀 등)를 기술하면 Lighting Model 이 조명의 상호 작용을 계산합니다.
디퓨즈 조명에 대한 Lambert와 스페큘러 조명에 대한 BlinnPhong 같은 두 가지 빌트인 조명 모델이 있습니다. Unity 내부의 Lighting.cginc 파일은 이러한 모델을 정의합니다(Windows: <unity install path>/Data/CGIncludes/Lighting.cginc, macOS: /Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc).
커스텀 조명 모델을 사용하고 싶은 경우도 있습니다. 이런 경우 표면 셰이더를 사용하면 됩니다. 조명 모델은 단순히 일부 규칙과 일치하는 몇 가지 Cg/HLSL 함수입니다.
| 기능 이름 | URP(유니버설 렌더 파이프라인) | HDRP(고해상도 렌더 파이프라인) | 커스텀 SRP | 빌트인 렌더 파이프라인 |
|---|---|---|---|---|
| 표면 셰이더 | 지원 안 함 URP에서 셰이더 오브젝트를 보다 간단하게 만드는 방법을 알아보려면 Shader Graph를 참조하십시오. |
지원 안 함 HDRP에서 셰이더 오브젝트를 보다 간단하게 만드는 방법을 알아보려면 Shader Graph를 참조하십시오. |
지원 안 함 | 지원 |
조명 모델은 이름이 Lighting으로 시작하는 일반 함수로 구성됩니다. 셰이더 파일 또는 포함된 파일 중 어느 곳에서나 선언할 수 있습니다. 함수는 다음과 같습니다.
half4 Lighting<Name> (SurfaceOutput s, UnityGI gi); 뷰 방향에 종속되지 않는 광원 모델의 포워드 렌더링 경로에 사용합니다.
half4 Lighting<Name> (SurfaceOutput s, half3 viewDir, UnityGI gi); 뷰 방향에 종속되는 광원 모델의 포워드 렌더링 경로에 사용합니다.
half4 Lighting<Name>_Deferred (SurfaceOutput s, UnityGI gi, out half4 outDiffuseOcclusion, out half4 outSpecSmoothness, out half4 outNormal); 디퍼드 셰이딩 경로에서 사용합니다.
모든 함수를 선언할 필요는 없습니다. 조명 모델은 뷰 방향을 사용하거나 사용하지 않습니다. 마찬가지로 조명 모델이 포워드 렌더링에서만 작동하는 경우에는 _Deferred 함수를 선언하지 마십시오. 이렇게 하면 이를 사용하는 셰이더가 포워드 렌더링에만 컴파일됩니다.
다음 함수를 선언하여 디코딩 라이트맵 데이터와 프로브를 커스터마이즈합니다.
half4 Lighting<Name>_GI (SurfaceOutput s, UnityGIInput data, inout UnityGI gi);스탠다드 Unity 라이트맵과 SH 프로브를 디코딩하는 데 Unity 에디터 안에 있는 UnityGlobalIllumination.cginc 파일(Windows: <unity install path>/Data/CGIncludes/UnityGlobalIllumination.cginc, macOS: /Applications/Unity/Unity.app/Contents/CGIncludes/UnityGlobalIllumination.cginc)에 있는 UnityGI_Base에서 확인할 수 있는 내장 DecodeLightmap 및 ShadeSHPerPixel 함수를 사용할 수 있습니다.
다음은 빌트인 램버트 조명 모델을 사용하는 셰이더 예제입니다.
Shader "Example/Diffuse Texture" {
Properties {
_MainTex ("Texture", 2D) = "white" {}
}
SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert
struct Input {
float2 uv_MainTex;
};
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = tex2D (_MainTex, IN.uv_MainTex).rgb;
}
ENDCG
}
Fallback "Diffuse"
}
다음은 씬에 방향 광원이 하나일 때 텍스처가 있을 경우와 없을 경우를 보여 줍니다.