如何计算raymarching中距离的视锥半径?

我是GLSL的“raymarching distance fields”(适当的术语:球体追踪)。 为了在其顶上实现锥形行进(并且无论是否添加锥形行进,还要最小化光线行进步骤的数量),我需要估计在任何给定距离处的光线锥的半径。

回想一下raymarching距离场,当到一个物体的距离小于一个阈值时,通常在代号为nearLimit或epsilon的地方logging一个“命中”。 这个阈值可以看作是等价于射线锥半径,如果我们随着距离的增加呈指数增长 – 这样,我们就不会将直射的细射线射入空间,而是锥体会根据透视投影而扩大。 这更精确地覆盖了捕捉“正确”的远处物体(在这一点上我们忽略混合材料和过滤距离为t的视锥中的所有相交物体的法线的问题)。

在第0步,这个半径可以近似于类似的东西

float fInitialRadius = 1 / min(screenwidth, screenheight); 

然后可以通过将起始半径应用于距离来按指数规律在每个步骤增加:

 fNearLimit = fTotalDist * fInitialRadius; // after each raymarching step 

这工作正常,但仍然有文物。 如果我使用fInitialRadius * fInitialRadius(导致从一个640px帧缓冲区的初始半径和一个单位宽度的视图平面是1/640的较小的数字)我得到更less的文物和更准确的结果。 但这两种方法都是不准确的,第一种是太急(半径太早太早),后者太懒(半径增加太小太迟)。

在给定的距离上增加fNearLimit /锥体半径的最准确的因素最有可能考虑到我当前的视野,并且将取决于视场是45°还是60°或90°或者…

TL; DR :我想知道定步骤0的初始像素半径和视场角θ 的给定距离处锥体半径的正确计算或最可接受的近似值是多less?

如果我正确地理解了您的问题,您要做的计算与标准投影或主光线生成计算非常相似。 这是一个粗略的图表,说明解决scheme 。