I’ve hit a bit of a stump recently. We’re looking to build an installation with multiple large displays that act similar to an NDisplay LED cave. Creating an illusion through forced perspective rather than accurate tracking.
For the moment the easiest would be to render out the LED panels into regular video. However, I couldn’t find a way to do that.
Without a provided feature I’ve tried setting up a system of orthographic cameras that film the planes and allow rendering out via sequencer. Unfortunately NDisplay does not run in editor while playing. During standalone mode they just disappear entirely (despite being visible and not hidden in game) and in PIE they remain black surfaces.
I suspect to have found the relevant bits in the C++ file but wasn’t able yet to modify the plugin for further use in 4.27 by other computers and would prefer not to have to transition the entire project onto a custom Unreal Engine version just to modify one of the default plugins as that would impact our overall pipeline and be a slightly convoluted solution long term.
Any help or idea about rendering NDisplay screens to video would be greatly appreciated!
Oh, just in case someone else stumbles upon this problem.
I’ve solved it.
Download Unreal Engine Source
Open the class Plugins/Runtime/nDisplay/Source/DisplayCluster/Private/Game/EngineClasses/Scene/DisplayClusterRootActorEditor.cpp
In the function “ADisplayClusterRootActor::Tick_Editor” change the first condition if (IsPreviewEnabled())//!IsRunningGameOrPIE() && IsPreviewEnabled())
Open the class Plugins/Runtime/nDisplay/Source/DisplayCluster/Private/Game/EngineClasses/Scene/DisplayClusterRootActor.cpp
In the function “IsRunningGameOrPIE”, replace the first return value with return false;//World && World->IsPlayInEditor();
Copy the nDisplay Plugin from your newly compiled project (Engine/Plugins/Runtime/nDisplay) into the plugin folder of your own project (MyProject/Plugins/nDisplay). Create folders if they do not exist yet.
In your new Project nDisplay plugin, open nDisplay/Binaries/Win64/UE4Editor.modules
Open up the same modules file from the installed Engine (C:\Program Files\Epic Games\UE_4.27\Engine\Plugins\Runtime\nDisplay\Binaries\Win64\UE4Editor.modules)
Copy the “BuildId” from the engine project into your custom compiled nDisplay.
Open your project and profit!
The build ID should go from a long hex to a relatively low number. For my .27 installation I went from “2a91d8a4-7699-45c8-88c9-556fd2467644” to “17155196”
What did I do and why?
Delete all checks whether the game is currently running. This means the preview will keep running when playing the game or when rendering a movie. While I didn’t check, I expect this change to break usual nDisplay operations. So only do this for rendering the Unreal project to video.
Copy the compiled engine plugin into the project plugin. Project plugins take priority over engine plugins which allows all your team members to properly render out scenes with nDisplay.
However, by default it will be detected as “compiled with a different engine version”. This is usually a useful check to make sure everything remains compatible. But we deliberately compiled the plugin to work with the same engine version. Meaning it is compatible, Unreal just doesn’t register this. So
We pretend the plugin was built with the correct engine version. We circumvent the check by manually entering the known ID and make Unreal believe it was compiled correctly for this version. Since we know for sure this is the case there shouldn’t be any issues.
Hello! Thanks for the explanation… We are also trying to render via Ndisplay, but no luck yet… Did you use sequencer or movie export? how did you connect ndisplay config with standart cameras? It would be awesome if you explain a bit more about rendering process…
I can answer you those questions but just a word of warning. The settings on the preview cameras are broken and you will not get good quality recordings in engine. Reflections, colors and light in general are not working right. It appears Epic truly meant for it to be nothing but a preview.
We ended up creating a setup where we’d have calibration textures as planes for the surfaces we wanna render. Render everything at a significantly higher resolution and then project that output in after effects into the movie files we wanted.
During this test period I rendered it out via the rendering queue. Using a custom util that would grab the planes from NDisplay, look up the material and assign it to a UI widget.
When setting up your ndisplay config you define planes. If you keep a reference to your nDisplay actor you can look up the components by name or set up tags as convenient.
Get the material of the plane. Which is a dynamic instanced material that has everything setup to display the nDisplay preview. You can apply this material to an image or other widget element that allows you to apply materials.