Optix Motion Transform Issue on 30-series GPUs

I am using optix with motion transforms in a simulation where a camera can optionally have motion blur. In certain circumstances, there are renders that need to be performed that result in motion transforms with zero delta (startTime = endTime) when a camera is rendered instantaneously in a simulation. I never had a problem with this until I tried running on a 3080. When the time delta is zero and I try to launch a trace at the same time as the keyframes (t = endTime = startTime), no objects show up in the scene. When the time is outside of the motion transforms time stamps, the objects show up just fine. If the motion transforms have a positive time delta, objects tend to show up okay, although I have seen intermittent issues with this as well where object either fully or partially disappear (per-pixel) throughout a simulation. I’ve tested this and see a similar issue across other 30-series GPUs, but not on any other GPU I’ve tried (1080, a100, 2080ti).

I was able to recreate this issue in both the 7.2 and 7.5 SDK samples using optixSimpleMotionBlur by setting the 3 occurrences of endTime = 0.0 and the traceCamera function to launch at t=0.0. I tested on linux with cuda 11.7 and driver 515.48.07 for both a 1080 (objects are rendered) and a 3080 (object are not rendered). Any idea why this is happening?

2 Likes

Hi @amelmquist, thanks for pointing this out. The motion blur team acknowledges this is broken and that currently timeBegin being equal to timeEnd is not allowed. We thought it was documented, but this current requirement doesn’t appear to be mentioned explicitly yet. Having a zero width interval would break the example key indexing code in the programming guide, for example.

We haven’t yet decided whether the fix is going to be a change to the documentation, or whether the code will be changed to support the case when the time range is zero. It is possible that we might not be able to support it, but I’ll report back either way once we decide.

There are a couple of alternatives in the mean time to consider. Possibly the easiest would be to not set your start and end times to be equal, but rather set your start and end keys to be equal and perhaps use a [0,1] time interval instead. Presumably your keys are already equal? Otherwise the traversal behavior would be undefined with equal times. A variation of this idea might be to separate your start/end times for BVH building vs your start/end time range for rays. You could easily restrict the ray times to be constant without requiring the key times to be identical. Both of these would always work and allow you to dynamically switch between blurred and unblurred without any other BVH updates. Will one of those work for you? Setting the times to be equal isn’t a use case we anticipated needing or have seen elsewhere and we’re curious if it’s necessary (i.e. I think it’s possible to always use a unit time interval of [0,1], and put a linear transform for the ray times on the input or output if you need to convert to a different time unit.)

Another option to consider is switching from a motion transform to a static transform when you want to disable motion blur. This takes more effort, but would have the advantage of using higher performance traversal for the frames when your camera goes static.


David.