我是GLSL中的“射线行进距离场”(适当的术语:球体追踪)。为了实现锥-前进在它的顶部(也是最小化的射线行进步骤的数目,无论是否加锥行进),我需要估计半径的射线锥在任何给定的距离。
回忆一下射线行进距离字段,当对象的距离小于阈值时,就会记录“命中”,通常是在名为nearLimit或epsilon的代码中。这个阈值可以被看作相当于射线-锥半径,如果我们指数地增加它,随着距离的移动--这样,我们不会将直线射入空间,而是按照透视投影来扩展锥。这更准确地涵盖了捕捉“右”远程对象的问题(在这一点上,让我们暂时忽略所有相交对象的混合材料和过滤法例的问题)。
在第0步中,这个半径可以近似为如下所示
float fInitialRadius = 1 / min(screenwidth, screenheight);然后,通过将起始半径应用于距离,可以在每一步以指数方式增加:
fNearLimit = fTotalDist * fInitialRadius; // after each raymarching step这是可行的,但仍然有工件。如果我使用fInitialRadius*fInitialRadius (由于640 If帧缓冲区的初始半径和单位宽度视图平面的初始半径为1/640),我得到的工件更少,结果更准确。但这两种方法都是不准确的,第一种方法太急(过早地增加半径),而后者太懒(增加半径太小,太晚)。
在给定的距离上增加fNearLimit /锥半径的最精确的因素必须考虑到我当前的视场,并且视视场是45°还是60°或90°或90°而变化。
TL;博士:我想知道,在给定距离下,圆锥体半径的正确计算或最可接受的近似是什么,,给定步骤0的初始像素半径和视场角度?
发布于 2012-07-05 17:36:39
锥的半径与其尖端的距离成线性关系。(否则它不是圆锥体!)
因此,如果圆锥与屏幕平面相交时有initialRadius,那么稍后:
radius(distance) = distance * initialRadius / focalDistance您必须在每一步重新计算该值,因为每一步都有不同的距离。
这里,distance是光线与照相机的距离,focalDistance是屏幕平面与摄像机的距离。
(对于不位于屏幕中心的像素,而不是focalDistance,使用屏幕平面上像素与摄像机的距离可能更准确。)
(或许更好的是,根本不要使用距离。只需使用深度,即只使用垂直于屏幕平面的矢量的分量。这可能是你的z轴或你的y轴,如果你已经把场景旋转到相机框中。)
https://stackoverflow.com/questions/10492590
复制相似问题