Version: 2022.1
언어: 한국어
라이트 프로브 및 씬 로딩
반사 프로브

Light Probe Proxy Volume 컴포넌트

Light Probe Proxy Volume(LPPV) 컴포넌트는 베이크된 라이트맵을 사용할 수 없는 대규모 동적 게임 오브젝트(예: 대규모 파티클 시스템 또는 스킨드 메시)에 더 많은 조명 정보를 사용할 수 있도록 합니다.

기본적으로, 프로브에서 빛을 받는 렌더러는 씬 내 주변 라이트 프로브에서 보간되는 단일 라이트 프로브로부터 조명을 받습니다. 이 때문에 게임 오브젝트는 표면 전체에 일정한 주변광을 제공합니다. 이 조명은 스피리컬 하모닉스를 사용하기 때문에 회전 경사도가 있지만 공간 경사도는 부족합니다. 이는 대규모의 게임 오브젝트나 파티클 시스템의 경우에 더욱 두드러집니다. 게임 오브젝트에 걸친 조명은 앵커 지점의 조명과 일치하며, 게임 오브젝트가 조명 경사도를 가로지르는 경우, 게임 오브젝트의 일부분이 올바르게 보이지 않을 수 있습니다.

Light Probe Proxy Volume 컴포넌트는 바운딩 볼륨 내에 보간된 라이트 프로브의 3D 격자 무늬를 생성합니다. 컴포넌트의 UI에서 이 격자 무늬의 해상도를 지정할 수 있습니다. 보간된 라이트 프로브의 스피리컬 하모닉스(SH) 계수는 3D 텍스처로 업로드됩니다. 그런 다음, SH 계수를 포함하는 3D 텍스처는 렌더 시간에 샘플링되어 산란 주변광의 효과를 분산시키기 위한 산출에 사용됩니다. 이는 프로브에서 빛을 받는 게임 오브젝트에 공간 그레디언트를 추가합니다.

스탠다드 셰이더는 이 기능을 지원합니다. 이를 사용자 셰이더에 추가하려면 ShadeSHPerPixel 함수를 사용해야 합니다. 함수 구현 방법에 대한 자세한 내용을 보려면 이 페이지 아래에 있는 파티클 시스템 샘플 셰이더 코드 예제를 참조하십시오.

렌더 파이프라인 지원

렌더 파이프라인의 Light Probe Proxy Volume 컴포넌트 지원에 대한 자세한 내용은 렌더 파이프라인 기능 비교를 참조하십시오.

컴포넌트를 사용하기 적합한 경우

Unity에서 대부분의 렌더러 컴포넌트는 라이트 프로브를 포함하고 있습니다. 아래의 세 옵션을 라이트 프로브에 적용할 수 있습니다.

  • Off: 렌더러는 보간 라이트 프로브를 사용하지 않습니다.

  • Blend Probes(기본값): 렌더러는 한 개의 보간 라이트 프로브를 사용합니다.

  • Use Proxy Volume: 렌더러는 보간 라이트 프로브의 3D 격자 무늬를 사용합니다.

Mesh Renderer 컴포넌트에서 Light Probes 프로퍼티를 Use Proxy Volume 으로 설정한 경우 게임 오브젝트에는 Light Probe Proxy Volume(LPPV) 컴포넌트가 부착되어 있어야 합니다. 동일한 게임 오브젝트에 LPPV 컴포넌트를 추가하거나 또는 Proxy Volume Override 프로퍼티를 사용하여 다른 게임 오브젝트에서 LPPV 컴포넌트를 사용할 수(빌려올 수) 있습니다. Unity가 현재 게임 오브젝트 또는 프록시 볼륨 오버라이드 게임 오브젝트에서 LPPV 컴포넌트를 찾을 수 없는 경우, 렌더러 하단에 경고 메시지가 표시됩니다.

예제

Light Probe Proxy Volume 컴포넌트를 사용한 간단한 메시 렌더러의 예제
Light Probe Proxy Volume 컴포넌트를 사용한 간단한 메시 렌더러의 예제

위에 씬에는 다량의 광원을 방출하는 머티리얼을 사용하는 두 개의 평면이 바닥 부분에 있습니다. 다음을 기억하십시오.

  • LPPV 컴포넌트를 사용하는 경우, 주변광은 지오메트리를 따라 변화합니다. 각 지오메트리 면에 일정한 컬러를 생성하려면 하나의 보간된 라이트 프로브를 사용해야 합니다.

  • 지오메트리는 정적 라이트맵을 사용하지 않으며 구체는 보간된 라이트 프로브를 나타냅니다. 이들은 Gizmo Renderer 의 일부입니다.

컴포넌트를 사용하는 방법

보간된 라이트 프로브의 3D 격자 무늬가 생성되는 영역은 Bounding Box Mode 프로퍼티에 영향을 받습니다.

아래의 세 옵션을 사용할 수 있습니다.

바운딩 박스 모드: 기능:
Automatic Local(기본값) 로컬 공간 바운딩 박스가 계산됩니다. 보간된 라이트 프로브의 포지션은 이 바운딩 박스 내에서 생성됩니다. 게임 오브젝트에 렌더러 컴포넌트가 부착되어 있지 않은 경우, 디폴트 바운딩 박스가 대신 생성됩니다. 바운딩 박스 산출 과정은 현재 렌더러를 포함하며 모든 렌더러를 Light Probes 프로퍼티가 Use Proxy Volume 으로 설정된 계층 구조 아래로 내립니다.
Automatic World 바운딩 박스는 현재 렌더러를 포함하고 모든 렌더러를 Light Probes 프로퍼티가 Use Proxy Volume 으로 설정된 계층 구조 아래로 내리는 방법으로 계산됩니다. 바운딩 박스는 월드에 정렬됩니다.
Custom 커스텀 바운딩 박스가 사용됩니다. 바운딩 박스는 게임 오브젝트의 로컬 공간에 지정됩니다. 바운딩 박스 편집 툴을 사용할 수 있습니다. UI에서 SizeOrigin 값을 수정하여 바운딩 볼륨을 수동으로 편집할 수 있습니다(아래 참조).

Automatic LocalAutomatic World 의 주된 차이점은 Automatic Local 의 경우 계층 구조가 복잡한 게임 오브젝트가 부모 게임 오브젝트로부터 같은 LPPV 컴포넌트를 사용할 때 바운딩 박스를 계산하기 위해 더 많은 리소스가 필요하다는 점입니다. 하지만 결과로 나온 바운딩 박스는 크기가 더 작아질 수 있으며 이는 조명 데이터가 더 압축되어 있음을 의미합니다.

바운딩 볼륨 내 보간 라이트 프로브의 개수는 Proxy Volume Resolution 프로퍼티에 영향을 받습니다. 아래 두 옵션을 사용할 수 있습니다.

  • Automatic(기본값) - 각 축의 해상도는 사용자가 지정한 단위 영역당 보간된 라이트 프로브의 개수와 바운딩 박스의 크기를 사용하여 계산됩니다.

  • Custom - 각 축마다 서로 다른 해상도를 지정할 수 있습니다. 아래를 참조하십시오.

참고: 각 축의 최종 해상도는 2의 계승이여야 하며 최대 해상도의 값은 32입니다.

Probe Position Mode 는 셀 중앙에 대한 보간된 라이트 프로브의 상대적 포지션을 지정합니다. 이 옵션은 일부 보간된 라이트 프로브가 벽이나 다른 지오메트리를 통과해서 빛이 새는 현상을 유발하는 경우 유용합니다. 아래의 예제는 2D 뷰에서 Cell CornerCell Center 의 차이를 4x4 격자 무늬 해상도를 사용해서 나타낸 것입니다.

Data Format 은 연결된 3D 텍스처가 사용하는 포맷을 지정합니다. 다음의 두 가지 옵션이 제공됩니다.

  • Float(기본값) - 텍스처가 32비트 부동 소수점 채널 포맷을 사용하여 스피리컬 하모닉 계수를 저장합니다.

  • Half Float - 텍스처가 half-float(16비트 부동 소수점) 채널 포맷을 사용하여 스피리컬 하모닉 계수를 저장합니다. 이 포맷의 장점으로는 half-float 리니어 텍스처 샘플링이 대부분의 기기에서 지원되고 이 포맷과 32비트 부동 소수점 채널 포맷 간의 정밀도 차이가 거의 없다는 점을 들 수 있습니다. 또한 GPU의 텍스처 샘플링 성능은 이 데이터 포맷을 사용할 때 더 뛰어납니다.

비교용 이미지

  1. 스탠다드 셰이더를 사용한 단순한 메시 렌더러

    라이트 프로브 프록시 볼륨이 적용된 예(해상도: 4x1x1)
    라이트 프로브 프록시 볼륨이 적용된 예(해상도: 4x1x1)
    라이트 프로브 프록시 볼륨이 적용되지 않은 예
    라이트 프로브 프록시 볼륨이 적용되지 않은 예
  2. 스탠다드 셰이더를 사용한 스킨드 메시 렌더러

    라이트 프로브 프록시 볼륨이 적용된 예(해상도: 2x2x2)
    라이트 프로브 프록시 볼륨이 적용된 예(해상도: 2x2x2)
    라이트 프로브 프록시 볼륨이 적용되지 않은 예
    라이트 프로브 프록시 볼륨이 적용되지 않은 예

ShadeSHPerPixel 함수를 사용한 파티클 시스템 샘플 셰이더

Shader "Particles/AdditiveLPPV" {
Properties {
    _MainTex ("Particle Texture", 2D) = "white" {}
    _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)
}

Category {
    Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
    Blend SrcAlpha One
    ColorMask RGB
    Cull Off Lighting Off ZWrite Off

    SubShader {
        Pass {

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_particles
            #pragma multi_compile_fog

            // Specify the target
            #pragma target 3.0

            #include "UnityCG.cginc"

            // You must include this header to have access to ShadeSHPerPixel
            #include "UnityStandardUtils.cginc"

            fixed4 _TintColor;
            sampler2D _MainTex;

            struct appdata_t {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
            };

            struct v2f {
                float4 vertex : SV_POSITION;
                fixed4 color : COLOR;
                float2 texcoord : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float3 worldPos : TEXCOORD2;
                float3 worldNormal : TEXCOORD3;
            };

            float4 _MainTex_ST;

            v2f vert (appdata_t v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
                o.color = v.color;
                o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                half3 currentAmbient = half3(0, 0, 0);
                half3 ambient = ShadeSHPerPixel(i.worldNormal, currentAmbient, i.worldPos);
                fixed4 col = _TintColor * i.color * tex2D(_MainTex, i.texcoord);
                col.xyz += ambient;
                UNITY_APPLY_FOG_COLOR(i.fogCoord, col, fixed4(0,0,0,0)); // fog towards black due to our blend mode
                return col;
            }
            ENDCG
        }
    }
}
}

하드웨어 요구 사항

이 컴포넌트에는 최소한 32비트 또는 16비트 부동 소수점 포맷과 리니어 필터링을 사용하는 3D 텍스처 지원을 포함하여 API 지원 및 Shader Model 4 그래픽스 하드웨어가 필요합니다.

컴포넌트가 올바르게 작동하려면 씬은 Light Probe Group 컴포넌트를 통해 라이트 프로브를 포함해야 합니다. 이 조건이 충족되지 않은 경우, 렌더러 또는 Light Probe Proxy Volume 컴포넌트 인스펙터에는 경고 메시지가 표시됩니다.

라이트 프로브 및 씬 로딩
반사 프로브