gpt4 book ai didi

3d - 如何在光线行进中计算一定距离处的视锥半径(即像素的大小)?

转载 作者:行者123 更新时间:2023-12-04 05:47:30 24 4
gpt4 key购买 nike

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

回想一下 raymarching 距离场,当到对象的距离小于阈值时,“命中”会被记录下来,通常在名为 nearLimit 或 epsilon 的代码中。如果我们随行进的距离呈指数增加该阈值,则该阈值可以被视为等效于光线锥半径 - 这样,我们不会将直线细线射入空间,而是根据透视投影扩展锥体。这更准确地涵盖了捕捉“正确”的远处物体(在这一点上,让我们暂时忽略在视锥中距离 t 处所有相交物体的混合 Material 和过滤法线的问题......)。

在第 0 步,这个半径可以近似为:

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

然后可以通过将起始半径应用于距离,在每一步以指数方式增加:
fNearLimit = fTotalDist * fInitialRadius;  // after each raymarching step

这工作正常,但仍然有工件。如果我使用 fInitialRadius*fInitialRadius(由于 640 像素帧缓冲区的初始半径和单位宽度 View 平面的初始半径为 1/640,因此产生的数字较小),我会得到更少的伪影和更准确的结果。但是这两种方法都不准确,第一种太急切(过早增加半径太多),后者太懒惰(增加半径太少太晚)。

在给定距离处增加 fNearLimit/锥体半径的最准确因素必须最有可能考虑到我当前的视野,并且将根据视野是 45° 或 60° 或 90° 或...

TL;博士 : 我想知道 给定距离处圆锥半径的正确计算或最可接受的近似值是什么给定步骤 0 的初始像素半径和视角?

最佳答案

圆锥的半径与距其尖端的距离成线性关系。 (否则它不是圆锥体!)

所以如果你的锥体有 initialRadius当它与屏幕平面相交时,然后:

radius(distance) = distance * initialRadius / focalDistance

您必须在每一步重新计算该值,因为每一步都需要不同的距离。

这里 distance是射线到相机的距离, focalDistance是屏幕平面到相机的距离。

(对于不在屏幕中心的像素,使用屏幕平面上像素与相机的距离代替 focalDistance 可能更准确。)

(或者也许更好,根本不使用距离。只需使用深度,即仅垂直于屏幕平面的向量分量。如果您将场景旋转到相机框架。)

关于3d - 如何在光线行进中计算一定距离处的视锥半径(即像素的大小)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10492590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com