If I understand that correctly you shoot a limited number of rays which should actually represent a continuous wavefront. The intersection with the receiver is basically tracking the run length of that wavefront. For obvious reasons you cannot shoot an infinite amount of rays to represent the solid wavefront to make sure you hit the receiver antenna which has a limited size in the real world.

Instead you’re trying to solve the registration of a wavefront hit at a receiver after some run length of the whole wavefront spanned between neighbouring rays by scaling the receiver according to some angular derivative (which would need to be tracked along the ray).

I do not see an elegant way to do this receiver scaling within OptiX’ acceleration structures. It would basically always require to look at all receivers in the worst case which would be similar as using NoAccel for them, or actually not putting them into the scene at all and intersect all rays with all of them (which is actually what I’m going to describe below).

But if I understood the problem correctly, you should be able to solve that wavefront propagation through a scene from transmitter to receiver more directly.

You know where your transmitters and receivers are located inside a scene.

For simplicity I’m assuming the transmitters and receivers are infinitely small points and for a beginning let’s also assume there is only one transmitter and one receiver to simplify the following explanation.

The transmitter sends a wavefront into the scene. The main question here would be how it would do that.

Possible special case:

The shortest connection between the transmitter and the receiver would be if they can see each other.

That direction would be one specific ray of a continuous wavefront.

This visibility condition can be checked very quickly with one ray type, (same as a shadow ray) by shooting such a ray from transmitter to receiver. All it needs is an anyhit program which terminates if anything is between the two endpoints. If the visibility check succeeds that means your wavefront from your transmitter to the receiver would be your first wavefront registration with the shadow ray’s distance.

Otherwise other objects inside the scene blocked that visibility ray.

Now you could actually shoot that or any other ray from your transmitter with a different ray type to capture closest hits.

If it hits an object, that hitpoint would need to be evaluated similarly for a connection to the receiver.

You would need to track an angular derivative along your ray. Means for each surface hit point, you would be able to calculate a cone of directions which represents a bundle of infinitely many rays representing the wavefront again.

Now you would need to calculate the reflection direction and the angular derivative gives you that cone spread angle around that new reflection direction.

Check if the receiver is in that cone of directions (simple dot product).

If yes, pick that direction and shoot a visibility ray to see if there is a direct connection.

If yes, that would be your second registration of a wavefront hit at a longer run length.

If your simulation end condition is not reached yet, pick some random ray inside the cone of valid directions and repeat.

This is actually also how you start at the transmitter for any other direction than the special case of direct visibility.

The angular derivative of the primary rays depends on the number of rays you start from your transmitter, the more the whole simulation uses, the smaller that initial cone angle.

This is a progressive Monte Carlo path tracing algorithm and as such you can scale this to fit your simulation needs in different ways.

For example handle each transmitter individually, handle each receiver individually, handle all at once, shoot different numbers of rays per launch, etc.

Does that make sense?

Please have a look at this GTC 2014 Presentation which sounds similar:

S4359 “Real-Time Electromagnetic Wave Propagation Using OptiX for Simulation of Car-to-Car-Communication” from Manuel Schiller.

Search for the session ID here: http://on-demand-gtc.gputechconf.com/gtcnew/on-demand-gtc.php