Color lookup tables (LUT) can be stored in a regular image by flattening one of its dimensions into a 2D image. This is an example of what a color LUT looks like:
You can use regular 2D textures as color LUTs for passthrough layers, but the texture must satisfy some requirements in order to work and create the desired effect:
The LUT resolution (R, number of values per dimension) must be a power of 2. Common values are 16, 32, and 64.
The image must contain R tiles, where each tile represents all red and green values for one specific blue value. Each tile contains R x R pixels, where the x-axis corresponds to red and the y-axis corresponds to green.
The tiles can either be stacked horizontally or arranged in a square (examples).
Square layouts are only possible if the square root of R is an integer, for example 16 or 64.
Creating a LUT texture in an image editor
Color LUTs can be generated by leveraging the color adjustment tools provided by any image editing software, such as Adobe Photoshop or GIMP. This tutorial demonstrates how to make adjustments in Photoshop, but the steps for other image editors are similar.
To create your own color LUT texture, follow these steps:
In Adobe Photoshop, open a representative image for the expected user environment (for example, a living room). To approximate the final experience as closely as possible, this should be a screenshot of passthrough, taken on the targeted headset(s). You can use one of the reference screenshots provided at the end of this document.
Open the Adjustments tab (Windows > Adjustments).
Add any desired adjustment layer, such as Curves or Color Balance as in the example below.
Click on the added adjustment layers to show their Properties tab. Tune the properties to create the desired change in color.
Once you are happy with the results, open one of the neutral color LUT images found on Neutral Color LUTs> in Photoshop.
Larger LUTs reflect color changes more accurately, but have a bigger performance impact. Experiment with different resolutions and using the smallest one that meets your desired quality.
Go to Window > Arrange > 2-up Vertical to see the two images side by side.
Drag all of your adjustments layers from the passthrough screenshot to the neutral color LUT image.
Go to File > Save As... and save the modified LUT image. Use a lossless image format such as PNG.
Reference screenshots
Save these images and load them in your image editor to preview color grading effects before applying them to a neutral LUT image.
Cold / natural lighting:
Warm / artificial lighting:
Applying a LUT texture
After creating a color LUT image, you can apply it to a passthrough layer in Unreal Engine.
To apply a color LUT to a passthrough layer, you create a UOculusXRPassthroughColorLut asset, assign a LUT texture to it, and then configure the passthrough layer to use it. Two LUT modes are available:
Color LUT: Blends a single LUT with the original passthrough image using a weight value. The formula is: Result = ColorLUTSource * LutWeight + Passthrough * (1 - LutWeight).
Interpolated Color LUT: Blends between two LUTs. The formula is: Result = ColorLUTSource * (1 - LutWeight) + ColorLUTTarget * LutWeight.
Create a UOculusXRPassthroughColorLut asset (under Miscellaneous > Passthrough Color LUT in the content browser) and assign the imported texture.
On the passthrough layer, enable Color Map and set Color Map Type to Color LUT or Interpolated Color LUTs.
Assign the LUT asset to Color LUT Source. For interpolated mode, also assign a Color LUT Target.
Adjust LUT Weight to control the blend intensity (range 0.0 to 1.0).
The maximum LUT resolution on Meta Quest is 64. Lower resolutions (such as 16 or 32) reduce memory usage and GPU cost, so use the smallest resolution that meets your quality requirements.
The IgnoreAlphaChannel property on UOculusXRPassthroughColorLut controls whether the alpha channel in the LUT texture is used. When enabled, only the RGB channels are applied. When disabled (the default), RGBA channels are used.
To create a LUT at runtime without a texture asset, for example to generate procedural color effects, use SetLutFromArray() to build the LUT data from a TArray<FColor>.
For the full walkthrough of applying color LUTs through the Inspector and Blueprints, see Color Mapping Techniques.