본문 바로가기
유니티 엔진

Light Probe Proxy Volume 라이트 프로브 프록시 볼륨

by 대마왕J 2016. 2. 7.
  • Unity 5.4 has entered beta and a stand out feature is the Light Probe Proxy Volume (LPPV). I just wanted to share with you all what it is, the workflow and some small experiments to show it in action.

    유니티 5.4 에는 라이트 프로브 프록시 볼륨이라고 하는게 들어가는군요.

    (역주: 기존의 라이트 프로브처럼 하나하나 박는 놈이 아니고 볼륨 박스를 넣는 놈 같네요 ..... 좀 더 정밀한 라이트 프로브 연산 블럭이 생긴다는 것 같은데요. 언리얼의 라이트 메스 임포턴트 볼륨처럼...? 말이죠. 그리고 3D Texture 기능을 이용할 것 같아요  )

    Correct as of 30.01.2016 – Subject to changes during 5.4 beta.

    What Is A Light Probe Proxy Volume?

    The LPPV is a component which allows for more light information to be used on larger dynamic objects that cannot use baked lightmaps, think Skinned Meshes or Particle Systems. Yes! Particle Systems receiving Baked Light information, awesome!

    LPPV는 라이트맵을 사용하지 않는 다이나믹 오브젝트, 스킨드 메쉬나 파티클 시스템 같은 다이나믹 오브젝트에게 더 많은 라이트 정보를 주는 놈이예요. 예쓰! 파티킬 시스템이 베이킹 라이트 정보를 받아요!!!! (역주: 호오. 그렇지만 파티클 쉐이더를 라이팅 연산 되는 녀석으로 써야겠지요? 아니면 되어서 나올려나)

     

     

     

     

    How To Use The LPPV Component?

    The LPPV component is a dependency of the Light Probe Group. The component is located under Component -> Rendering -> Light Probe Proxy Volume, by default, the component looks like this:

    LPPV 컴포넌트는 라이트 프로브 그룹에 속해 있어요. 컴포넌트는  Component -> Rendering -> Light Probe Proxy Volume 에 있고 기본적으로 아래처럼 생겼어여
    Light Probe Proxy Volume Component_1

    It’s a component you will need to add to the GameObject such as a Mesh or even a Light Probe Group. The GameObject you want to be affected by the LPPV needs to have a MeshRenderer / Renderer that has the Light Probes property set to “Use Proxy Volume:

     

    이게 당신이 메쉬나 라이트 프로브 그룹에 더해야 할 필요가 있는 컴포넌트지요. LPPV 적용하려는 게임오브젝트는 메쉬렌더러 / 렌더러 에 라이트 프로브 프로퍼티가 “Use Proxy Volume: 으로 되어 있어야 해요.

     

    Light Probe Proxy Volume Component_3

    You can borrow another existing LPPV component which is used by other GameObjects by using the Proxy Volume Override, just drag and drop it into the property field for each Renderer you want to use it. An example: If you added the LPPV component to the Light Probe Group object, you can then share that across all renderers with the Proxy Volume Override property:

    이미 존재하는 다른 LPPV 컴포넌트- 즉 다른 오브젝트에 프록시 볼륨 오버라이드로 사용하고 있는 - 것을 빌릴 수도 있는데요, 그냥 사용하고자 하는 각 렌더러의 프로퍼티 필드에 드레그엔 드롭하셔도 돼요. 예를 들어 :  LPPV 컴포넌트를 라이트 프로브 그룹 오브젝트에 적용했다면 , 당신은 다른 모든 오브젝트의 프록시 볼륨 오버라이트 프로퍼티에 공유할 수 있어요

     

    Use Proxy Volume

    Setting up the Bounding Box:

    There’s three options for setting up your Bounding Box:

    바운딩 박스에 세 개의 옵션이 있는데요

    • Automatic Local
    • Automatic World
    • Custom

    Automatic Local:

    Default property setting – the bounding box is computed in local space, interpolated light probe positions will be generated inside this box. The bounding box computation encloses the current Renderer and all the Renderers down the hierarchy that have the Light Probes property set to Use Proxy Volume, same behaviour for Automatic World.

    기본 셋팅 - 바운딩 박스는 로컬 스페이스에서 계산되구여. 생성된 박스 위치 안에서 라이트 프로브가 보간되어요. 바운딩 박스는 이 렌더러에 둘러쌓여 계산되고 모든 렌더러는 프록시 볼륨을 사용하도록 셋팅된 라이트 프로퍼티의 계층 아래로 내려갑니다. 오토매틱 월드에서와 같이요.

     

    Light Probe Proxy Volume Component_1

    Automatic World:

    A world-aligned bounding box is computed. Automatic Global and Automatic Local options should be used in conjunction with Proxy Volume Override property on other Renderers. Additionally you could have a whole hierarchy of game objects that use the same LPPV component set on a parent in the hierarchy.

    The Difference between this mode and Automatic Local is that in Automatic Local the bounding box is more expensive to compute when a large hierarchy of game objects uses the same LPPV component from a parent game object, but the resulting bounding box may be smaller in size, meaning the lighting data is more compact.

    월드 - 정렬 바운딩 박스가 계산됩니다. 오토매틱 글로벌과 오토메틱 로컬 옵션은 다른 렌더러들의 프록시 볼륨 오버라이트 프로퍼티의 연결로 사용될거구요. 또한 당신은 전체의 게임 오브젝트 계층 구조를 가질 수 있을 겁니다. - 같은 LPPV 컴포넌트를 하이어라키 안의 부모로 셋팅한.

    이 모드와 오토매틱 로컬의 차이는 오토메틸 로컬 바운딩 박스는 더 비쌀겁니다 - 보다 큰 하이어라키를 가진 게임 오브젝트가 같은 LPPV 컴포넌트를 부모 게임 오브젝트로 사용하면 - 그렇지만 바운딩 박스 결과는 사이즈가 더 잘을 것이고, 이것은 라이팅 데이터가 더 컴팩드 하다는 것을 의미합니다. (주: 뭔소리야) 

     

    Custom:

    Empowers you to edit the bounding box volume yourself in the UI, changing the size and origin values in the Inspector or by using the tools to edit in the scene view. Bounding box is specified in local space of the GameObject. You will need to ensure that all the Renderers are within the Bounding Box of the LPPV in this case.

    커스텀 : 바운딩 박스 크기를 직접 조절할 수 있어여. 씬 뷰에서 알아서 에디트해서 사이즈라던가 값을 변화시킬 수 있습니다. 바운딩 박스는 게임오브젝트의 로컬 스페이스에 지정됩니다. 당신은 이 경우에는 모든 렌더러가 LPPV 바운딩 박스에 있는지 확인해야 합니다.

     

    Light Probe Proxy Volume Component

    Setting Up Resolution / Density:

    After setting up your bounding box, you need to then consider the density / resolution of the Proxy Volume. To do this there’s two options available under Resolution Mode:

    바운딩 박스를 셋팅한 다음에 프록시 볼륨의  밀도와/해상도를 결정해야 합니다. 해상도 모드 아래에는 두 개의 옵션이 있어요

    Automatic:

    Default property setting – set a value for the density i.e. number of probes per unit. Number of probes per unit is calculated in the X, Y and Z axis, so defined by the bounding box size.

    자동:

    기본 프로퍼티 셋팅 - 밀도값을 셋팅합니다. 즉. 한 유닛당 프로브의 숫자를 정의하는거지요 . 프로브의 각 유닛당 숫자는 xyz에서 결정되구여. 그래서 바운딩 박스 사이트로 인해 뭐 정의되고 그러는 거죠

     

    Custom:

    Set up custom resolution values in the X, Y and Z axis using the drop down menu. Values start at 1 and increment to a power of 2 up to 32. You can have 32x32x32 interpolating probes

    커스텀 : xyz 안의 커스텀 해상도 값을 드롭다운 메뉴에서 결정할 수 있습니다. 값은 1에서 시작해서 2의 배수로 32까지 됩니다.
    즉 32*32*32 보간 프로브를 가질 수 있습니다.

     

    Interpolating Probes

    Performance Measurements To Consider When Using LPPV:

    LPPV 사용시의 퍼포먼스 측정

    Keep in mind the interpolation for every batch of 64 interpolated light probes will cost around 0.15ms on CPU (i7 – 4Ghz) (at the time of Profiling). The Light probe interpolation is multi-threaded, anything less than or equal to 64 interpolation light probes will not be multi-threaded and will run on the main thread.

    각 64개의 라이트 프로브 인터폴레이션 배치 연산에 0.15ms 의 CPU가 먹는다는 것을 주의해야 합니다. (프로파일링 타임에서요) 라이트 프로브 인터폴레이션은 멀티 쓰레드이고, 64개나 그 이하의 인터폴레이션 라이트 프로브는 멀티 쓰레드 되지 않고 메인 쓰레드에서 돌아간답니다.

     

    Using Unity’s built-in Profiler you can see BlendLightProbesJob on the main thread using the Timeline viewer, if you increase the amount of interpolated light probes to more than 64 you will see BlendLightProbesJob on the worker thread as well:

    유니티 빌트 인 프로파일러를 사용하면 당신은 BlendLightProbesJob 을 메인 쓰레드 타임라인 뷰어에서 볼 수 있습니다.

    64개 이상의 인터폴레이션 라이트 프로브를 사용하면 BlendLightProbesJob 을 워커 쓰레드에서도 볼 수 있어용 :

    BlendLightProbesJob

    The behaviour for just one batch of 64 interpolated light probes is it will run only on the main thread and if there are more batches (>64) it will schedule one on the main thread and others on the worker threads, but this behaviour is just for one LPPV. If you have a lot of LPPVs with less than 64 interpolated light probes each, they will all run on the main thread.

     

    Hardware Requirements:

    The component will require at least Shader Model 4 graphics hardware and API support, including support for 3D textures with 32-bit floating-point format and linear filtering.

    컴포넌트는 셰이더 모델 4 그래픽 카드를 필요로 합니다 (주 : ...에? 그럼 PC 전용이네...?????? ) 32비트 플로팅 포인트 포맷의 , 리니어 필터링의 3D 텍스쳐를 지원해야 합니다. (주: ... 어 이놈 3D 텍스쳐로 하는건가 보네요!!! SH 연산이 아니야?!??!)

     

    Sample shader for particle systems that uses ShadeSHPerPixel function:

    The Standard shaders have support for this feature. If you want to add this to a custom shader, use ShadeSHPerPixel function. Check out this sample to see how to use this function:

    스텐다드 쉐이더에서 지원해요 . 만약 커스텀 쉐이더에서 이걸 지원하게 하고 싶으면

    ShadeSHPerPixel 함수를 사용하세요. 아래 예제를 보고 따라하세용

     

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    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
                // Don’t forget to specify the target
                #pragma target 3.0
     
                #include "UnityCG.cginc"
                // You have to 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
             }
          }
       }
    }

     

    반응형

    댓글