How To Get Eye Adaptation (Auto Exposure) Value.

아무리 찾아도 관련 정보가 없음. 아마 진짜 전세계에서 처음일듯 ㄷㄷ;

찾는 방법은 좀 복잡하긴한데, 값은 잘 나옴.

float GetEyeAdaptationValue()
 {
     APlayerController* PC = UGameplayStatics::GetPlayerController(this, 0);
     ULocalPlayer* LocalPlayer = Cast(PC->Player);
     if (LocalPlayer != NULL &&
      LocalPlayer->ViewportClient != NULL &&
      LocalPlayer->ViewportClient->Viewport != NULL)
     {
          FSceneViewFamilyContext ViewFamily(FSceneViewFamily::ConstructionValues(
              LocalPlayer->ViewportClient->Viewport,
              GetWorld()->Scene,
              LocalPlayer->ViewportClient->EngineShowFlags).SetRealtimeUpdate(true));

          FVector ViewLocation;
          FRotator ViewRotation;
          FSceneView* SceneView = LocalPlayer->CalcSceneView(&ViewFamily, /out/ ViewLocation, /out/ ViewRotation, LocalPlayer->ViewportClient->Viewport);
          if (SceneView)
          {
              FSceneViewState* SceneViewStatePtr = SceneView->State ? SceneView->State->GetConcreteViewState() : nullptr;
              if (SceneViewStatePtr)
              {
                  float LastExposure = SceneViewStatePtr->GetLastEyeAdaptationExposure();
                  UE_LOG(LogTemp, Warning, TEXT("%f"), LastExposure);
              }
          }
     }
 }
  1. 플레이어 컨트롤러를 가져옴.
  2. 로컬 플레이어인지 확인하고 로컬 플레이어 포인터를 가져옴.
  3. FSceneViewFamiliy 구조를 완성시켜 로컬 플레이어의 FSceneView 를 계산함.
  4. FSceneView를 가져오면, FSceneViewState의 Interface 가 제공될텐데, 그 인터페이스에서 GetConcreteViewState() 로 FSceneViewState를 가져옴.
  5. 가져온 FSceneViewState의 포인터에서 GetLastEyeAdaptationExposure() 함수로 눈 순응도를 가져옴.

눈 순응도는 이전 프레임의 눈 순응도를 가져오는 것임을 주의.

현재 눈 순응도를 바로 계산해서 갖고오고 싶으면 렌더링 쪽에서 FViewInfo 를 가져와야하는데, 아무리 찾아도 방법이 없는 느낌임.

렌더 커맨드로 가져올 수 있을까도 싶은데, 나중에 좀 더 찾아봐야할듯.