Version: Unity 6.0 (6000.0)
언어 : 한국어
빌트인 렌더 파이프라인의 표면 셰이더 생성
표면 셰이더 최적화

빌트인 렌더 파이프라인의 표면 셰이더 조명 모델 설정

빌트인 렌더 파이프라인에서 표면 셰이더를 작성할 때 사용자가 표면의 프로퍼티(알베도 컬러 및 노멀 등)를 기술하면 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으로 시작하는 일반 함수로 구성됩니다. 셰이더 파일 또는 포함된 파일 중 어느 곳에서나 선언할 수 있습니다. 함수는 다음과 같습니다.

  1. half4 Lighting<Name> (SurfaceOutput s, UnityGI gi); 뷰 방향에 종속되지 않는 광원 모델의 포워드 렌더링 경로에 사용합니다.

  2. half4 Lighting<Name> (SurfaceOutput s, half3 viewDir, UnityGI gi); 뷰 방향에 종속되는 광원 모델의 포워드 렌더링 경로에 사용합니다.

  3. half4 Lighting<Name>_Deferred (SurfaceOutput s, UnityGI gi, out half4 outDiffuseOcclusion, out half4 outSpecSmoothness, out half4 outNormal); 디퍼드 셰이딩 경로에서 사용합니다.

모든 함수를 선언할 필요는 없습니다. 조명 모델은 뷰 방향을 사용하거나 사용하지 않습니다. 마찬가지로 조명 모델이 포워드 렌더링에서만 작동하는 경우에는 _Deferred 함수를 선언하지 마십시오. 이렇게 하면 이를 사용하는 셰이더가 포워드 렌더링에만 컴파일됩니다.

커스텀 GI

다음 함수를 선언하여 디코딩 라이트맵 데이터와 프로브를 커스터마이즈합니다.

  1. 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에서 확인할 수 있는 내장 DecodeLightmapShadeSHPerPixel 함수를 사용할 수 있습니다.

예제

다음은 빌트인 램버트 조명 모델을 사용하는 셰이더 예제입니다.

  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"
  }

다음은 씬에 방향 광원이 하나일 때 텍스처가 있을 경우와 없을 경우를 보여 줍니다.

빌트인 렌더 파이프라인의 표면 셰이더 생성
표면 셰이더 최적화