How to Use Hooks to Gain Low-Level Access to the OWL 180/ 360 Degree Render Pipeline

How to Use Hooks to Gain Low-Level Access to the OWL 180/ 360 Degree Pipeline for Unreal Engine Movie Render Queue
Written by Off World Live
Updated 5 days ago

In order to support low-level access to important sections of the OWL 360 Movie Render Pipeline, we have exposed a new hooks class. Our 360 Burn-In renderer binds into this. These hooks are only available to PRO 360 Movie Render Queue licensees.

See the full C++ header file OWLMRQ360Hooks.h in the Source/OWLMRQPipeline/Public/OWL360Camera folder

Blueprints

While this class is blueprintable, only a subset of the methods are available in blueprints because of the Unreal restrictions that blueprints only be executed on the game thread.

Methods:

  • Setup_GameThread - called while the pipeline is being initialised. This is useful for setting up any objects or variables required in your class later
  • TearDown_GameThread - called when the movie pipeline is being destroyed. For cleaning up variables / data
  • PreRenderCamera_GameThread - Called on the game thread for each camera found. Be aware that cameras are sometimes not rendered (e.g. when Fade is 0 ) and so it's important to check the bSkipRendering flags. Also note that when rendering composited outputs, this hook will be called for every camera, however the PostComposite_TaskThread hook will only be called once for the composited output. You can check the setting OWLPass→Settings.Output.bCompositeCameras for this.
  • ModifyTilePostProcess_GameThread - called for each file of each face on each camera. This exposes mutable Post Process Settings struct which can be modified, like for example by adding a custom Blend Material with face or tile-specific material parameters.

C++

C++ can call all of the above methods by overriding the above methods with the _Implementation suffix

Additionally there are the following methods:

  • PostStitch_TaskThread - this is run concurrently on different task threads and enables modification of the raw pixel data.
  • PostComposite_TaskThread - run concurrently on different task threads after stitching and any compositing or adjustment due to Fade values.
  • PostTileRender_RenderThread - this is executed on the render thread after each tile / face is rendered with an FTextureRHIRef Tile that can be used in custom C++ shaders etc. This happens before the surface is read

Adding passes / Submitting extra layers to output

It is trivial to add extra passes to the render. These passes are pure C++ and can perform calculations or simply append layers.

To submit a pass call one of the three AddRenderPass_... methods below from inside your class:

  • AddRenderPass_8Bit
  • AddRenderPass_16Bit
  • AddRenderPass_32Bit

All 3 methods take the PassIdentifier which is an unreal struct for EXR / output file labelling and a callback with the following typing:

bool YourCallback32Bit(
  const FMoviePipelineRenderPassMetrics& SampleState,
  const FIntPoint& OutputResolution,
  TArray64<FLinearColor>& OutData) { return true};
Did this answer your question?