Epic Games touted their VR-optimized forward renderer as the reason why their forthcoming Robo Recall game looks so crisp in VR. Now the tech is available to all Unreal Engine developers in version 4.14 released today.
While deferred rendering has become a popular choice in game engines lately thanks to its efficient calculations of lighting and shadows, using a forward renderer opens the door to the multi-sample anti-aliasing technique (MSAA) which is especially well suited as it can enhance the sharpness of the scene in VR compared to other methods of anti-aliasing. In Epic’s words:
The forward renderer works by culling lights and reflection captures to a frustum-space grid. Each pixel in the forward pass then iterates over the lights and reflection captures affecting it, shading the material with them. Dynamic shadows for stationary lights are computed beforehand and packed into channels of a screen-space shadow mask allowing multiple shadowing features to be used efficiently.
The company says the forward renderer is “about 22% faster than the deferred renderer on an NVIDIA 970 GTX,” for Robo Recall. Improved rendering performance means more overhead to make increasingly complex and graphically rich scenes (or reduce the power needed to run a scene of the same complexity).
Graphically rich indeed, Robo Recall, which Epic announced last month as an Oculus Rift exclusive shooter for Touch, has some of the best looking graphics you’ll find in VR right now. If you’re curious about the technical differences between a forward renderer and a deferred renderer, see here.
Unreal Engine 4.14 is also packed with other VR enhancements, here’s a quick summary (or see the full release notes here):
Precomputed Lighting Scenarios
We now support precomputing lighting for multiple lighting setups with the same geometry! This is especially important for use cases such as VR and architectural visualization where you need the highest possible quality at the fastest possible performance. In the above example the directional light, sky light and skybox have been placed in a Lighting Scenario level called DayScenario. The streetlights have been placed in NightScenario.
Landscape Editing in VR
[gfycat data_id=”PaltryDelayedFlounder” data_autoplay=true data_controls=false]
You can now create and sculpt terrain and paint landscape materials using motion controllers in VR! You can summon the Landscape Editing tools from the “Modes” panel on your Quick Menu. Then choose a brush from the UI and start painting! If you hold the “Modifier” button on the motion controller, you can erase instead of painting.
VR Multiview Support for Mobile (experimental)
You can now use the mobile multiview path on supported devices! Mobile multiview is similar to instanced stereo on the desktop, and provides an optimized path for stereo rendering on the CPU.
Layer Support for SteamVR and PSVR
Layer support has now been added for both SteamVR and PSVR! It works exactly like it does for the Oculus Rift plugin, using the Stereo Layer component.
VR Loading Movies
The engine now supports loading movies on Oculus, GearVR, SteamVR, and PSVR. These run on the rendering thread, and can mask framerate hiccups as you load up your content. To use the splash screen, you can set a texture using the “Set Splash Screen” node, or choose to automatically have it appear when you load a map with the “Enable Auto Loading Splash Screen” node.
PSVR Support for Multiple Framerate Targets
We now support native 90Hz to 90Hz reprojection and 120Hz to 120Hz reprojection on the PSVR! This means you can opt in to running at a higher framerate to minimize latency and reprojection artifacts. The engine will limit your framerate to your selected option, but it’s still your responsibility to make sure you consistently maintain that framerate!
VR Changelog (click to expand)
- New: Added support for getting the HMD Device name (e.g. “OculusRift,” “SteamVR,” “PSVR,” etc) through Blueprints and C++.
- New: Added the “Start in VR” project setting, which enables projects to specify that they would like to automatically attempt to run in VR mode, regardless of whether or not -vr is passed on the commandline.
- New: Added the ability to re-enter VR preview in the Editor after exiting from it using the quit option inside the SteamVR overlay. Previously one had to quit and restart the Editor to re-enable VR.
- It is now possible to reliably exit a game from the Steam VR overlay exit button, even when previewing in the Editor.
- New: Added the ability to select which HMD module to use on startup by passing “hmd=” on the command line.
- This is useful if you have more than one type of device attached to your machine. If no device matches the name passed in, a warning will be printed to the log and VR will be disabled.
- New: Added support to the Oculus Rift for the “r.ScreenPercentage” console variable if it is set manually.
- The obsolete console command “HMD SCREENPERCENTAGE” will still work, but assigning to “r.ScreenPercentage” is now the preferred way.
- New: Updated the PSVR 2DVR texture to now be a UTexture, so it can be a RenderTarget, etc. Also improved error reporting for this and some other PSVR features.
- New: Added three options to the PSVR HMD Setup Dialog Cancel reactions.
- Disallow Cancel – Put the HMD Setup Dialog up again. Appropriate for titles that only support VR output.
- Switch To 2D – Switch to 2D output mode and send the HMD Connect Canceled Delegate. Appropriate for apps where 2D play is supported.
- Delegate Defined – Fire the HMD Connect Canceled Delegate. The project needs to handle this delegate and take appropriate action while being mindful of TRC requirements.
- Be sure to consider the case where the HMD is disconnected as the program starts up.
- New: Added delegates for when the PSVR headset is taken off the head or put on the head.
- New: Updated GoogleVR SDK to v1.01, which adds proper support for splash screens.
- New: Updated OSVR plugin.
- Fixes multiple crashes, and improves tracking.
- New: Added VR splash screen for level transitions.
- New: Updated UI elements that composite after reprojection to preserve quality.
- Bugfix: Applied fix for Adreno GearVR devices rendering black on startup.
- Bugfix: Fixed Add Controller Yaw Input with PSVR. The yaw was being reset every frame.
- Bugfix: Fixed an issue where the main editor window was not restored after exiting VR preview in some cases.
- Bugfix: Fixed crash when exiting PIE while a panoramic screenshot was in the process of being taken.
- Bugfix: Fixed motion controller attachment movement when the game is paused.
- Bugfix: Fixed PSVR reprojection prediction time. HMD motion now runs off the edge of the rendered area less easily.
- Bugfix: Fixed saving the Oculus Rift INI setting “bPixelDensityAdaptive”. It was previously saved as a floating point value instead of a boolean.
- Bugfix: Fixed some static analysis warnings in Oculus Rift plugin code.
- Bugfix: Fixed the “Get bounds node” for SteamVR to return the correct bounds if they have changed since initialization. This could happen if the HMD was outside of tracking area during start up.
- Worked around a bug in SteamVR that caused VR to fail to initialize if SteamVR isn’t running when launching the application.
- Added positional tracking information on PSVR even when the device isn’t optically tracked. This enables proper IPD to be taken into account for rendering.
- Added support for the left menu button on the Oculus Touch controllers.
- Adjusted Hidden/Visible area masks to eliminate black crescents at the top and the bottom edges of the PSVR HMD.
- Updated changing world to meters scale while running in VR Preview mode in the Editor on Oculus Rift so that it now correctly applies the changes to the Oculus Touch controllers.
- Updated VR play-in-editor to always use “Game has mouse focus” option, to ensure that motion controllers are routing input correctly to the game.
- Added a PSVR Morpheus project setting to set the reprojection wrap mode to Mirror or Clamp To Border. This determines how left and right reprojection artifact pixels are filled.
- Mirror, the default, fills them with some nearby pixels.
- ClampToBorder fills them with the border color (usually black).
- Most content works best with mirror.
- Updated PSVR to now ignore partial HMD tracking data before the HMD has been tracked in a game session because orientation based re-projection does not function until that happens. There is a project setting to disable this, should the PS4 behavior change in the future.