I’ve set up a mesh with very different materials on each LOD, so I can clearly see where the LODs are switching.
If I launch the game with -emulatestereo, with or without an HMD connected, I see the LODs switching normally. Of course playing in non-stereo, the LODs work fine as well.
If I launch the game without -emulatestereo and with an HMD connected, ie: real stereo, I only ever see the highest LOD, and performance is extremely bad.
So I’ve narrowed it down to only a real HMD causing LOD determination to break.
Has anyone seen this before? Is there a fix in the works?
bool ULocalPlayer::GetProjectionData(FViewport* Viewport, EStereoscopicPass StereoPass, FSceneViewProjectionData& ProjectionData)
{
...
// Get the viewpoint.
FMinimalViewInfo ViewInfo;
GetViewPoint(/*out*/ ViewInfo);
float FOVDegrees = ViewInfo.FOV; /**/
// If stereo rendering is enabled, update the size and offset appropriately for this pass
const bool bNeedStereo = GEngine->IsStereoscopic3D() && (StereoPass != eSSP_FULL);
if( bNeedStereo )
{
GEngine->StereoRenderingDevice->AdjustViewRect(StereoPass, X, Y, SizeX, SizeY);
FOVDegrees = FMath::RadiansToDegrees(ViewInfo.FOV); /**/
}
// scale distances for cull distance purposes by the ratio of our current FOV to the default FOV
PlayerController->LocalPlayerCachedLODDistanceFactor = FOVDegrees / FMath::Max<float>(0.01f, (PlayerController->PlayerCameraManager != NULL) ? PlayerController->PlayerCameraManager->DefaultFOV : 90.f); /**/
Ie: need to convert the HMD FOV to degrees in this particular spot. Modified lines are marked with /**/.
The FOV related code (and view code in general) is a bit of a mess, so a proper fix would take more work, but this should get people going if they run into this problem.