Optix for image sequences


Tech artist here, so I have a very basic understanding of this whole Optix world, I mostly use it from the user side, in CG software.

I have downloaded the SDK, and am going through the documentation but this is a bit overwhelming.

I would like to know if it is possible to run Optix in standalone to denoise a sequence of already rendered EXR files?

And if so, where should I start to get there?

Thanks a lot!

Hi there @crontan, welcome!

You can play with the SDK sample called optixDenoiser which can denoise an image file or image sequence and save the results to files. Build it and run it without arguments to see the command line options, which include passing separate beauty, normal, albedo, flow, specular, and AOV images, specifying optional frame numbers, exposure, tiling, alpha, upscaling, etc… You can, of course, take that sample and customize it to do whatever you need, as long as you’re comfortable writing a bit of C++.

Keep in mind that doing file I/O to read and write images is a performance limiter. This standalone sample is meant to show how to use the denoiser API, and provide a way to manually test and validate results, but does not demonstrate the denoiser’s speed. To get a sense for the performance of the OptiX denoiser, use it in an interactive setting.


Thank you very much for this answer, very clear!

One last thing, even just for demo purpose, does the optixDenoiser sample implements the temporal feature, or is it just for raytracing apps implementing it?


The temporal denoising requires multiple input images (-F, --Frames) and a flow image (-f, --flow) which are both part of the command line options of the optixDenoiser example, so yes, if you have that required input data, the example can apply it.

Look for the code paths with temporalMode inside the example source to see where that happens.

The optixDenoiser application in OptiX SDK 8.0.0 has these command line parameters:

void printUsageAndExit( const std::string& argv0 )
    std::cout << "Usage  : " << argv0 << " [options] {-A | --AOV aov.exr} color.exr\n"
              << "Options: -n | --normal <normal.exr>\n"
              << "         -a | --albedo <albedo.exr>\n"
              << "         -f | --flow   <flow.exr>\n"
              << "         -A | --AOV    <aov.exr>\n"
              << "         -S            <specular aov.exr>\n"
              << "         -T            <flowTrustworthiness.exr>\n"
              << "         -o | --out    <out.exr> Defaults to 'denoised.exr'\n"
              << "         -F | --Frames <int-int> first-last frame number in sequence\n"
              << "         -e | --exposure <float> apply exposure on output images\n"
              << "         -t | --tilesize <int> <int> use tiling to save GPU memory\n"
              << "         -alpha denoise alpha channel\n"
              << "         -up2 upscale image by factor of 2\n"
              << "         -z apply flow to input images (no denoising), write output\n"
              << "         -k use kernel prediction model even if there are no AOVs\n"
              << "in sequences, first occurrence of '+' characters substring in filenames is replaced by framenumber\n"
              << std::endl;
    exit( 0 );

Note that the optixOpticalFlow example (requires Ampere or newer GPU) is able to generate flow images from two input images, but that is done with a 2D optical flow algorithm using video technology which is inferior to the flow images from ray tracing renderers when they are able to produce the actual motion vectors during rendering, so quality could vary.

More information about the OptiX Denoiser can be found inside the OptiX Programming Manual:

Related post on what denoiser modes are recommended:

1 Like

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.