【问题标题】:How is ray coherence used to improve raytracing speed while still looking realistic?如何使用光线相干性来提高光线追踪速度,同时仍然看起来很逼真?
【发布时间】:2011-12-25 10:12:03
【问题描述】:

我正在考虑在我的软件每像素实时光线投射器中利用光线相干性。

AFAICT,使用统一网格,如果我将光线相干性分配给 4x4 像素的补丁(目前我每个像素有一个光线投射),给定 16 条具有不同起点(和终点)点的平行光线,这是如何工作的出一个连贯的场景?我预见的是:

  1. 存在一段距离,在该距离内,相邻/相似光线的光线行进将完全相同。在那个距离内,我节省了处理费用。 (我怎么知道那个距离是多少?)
  2. 由于某些光线没有在正确的时间发散,因此我最终会得到一个稍微不正确的图像。

鉴于我的光线是从单个点而不是平面投射的,我想我需要根据经过的距离进行某种拆分功能,这样所有光线的集合在向外移动时会形成一棵树。我担心的是,靠近观看者时会丢失更精细的细节。

我想我只是不明白这是如何使用的。

【问题讨论】:

    标签: optimization raytracing raycasting


    【解决方案1】:

    如果操作正确,光线相干性不会影响最终图像。因为光线非常靠近,所以它们在穿过加速结构(kd-tree、aabb 树等)时都会采用相似的路径,这是一个很好的变化。您必须沿着任何光线可能击中的每个分支向下走,但希望这不会过多地增加分支的数量,并且可以节省内存访问。

    另一个优点是您可以使用 SIMD(例如 SSE)来加速您的一些测试,无论是在加速结构中还是针对三角形。

    【讨论】:

    • 在光线包追踪中是否进行了分支,以减轻光线在更远距离处的转移?一幅画在这里画一千个字。我希望我能找到一个。
    • 找不到图片,但 Ingo Wald 的博士论文 (sci.utah.edu/~wald/Publications/2004///WaldPhD/download//…) 在 7.2.3 SIMD Packet Traversal for kd-Trees 中对此进行了描述。
    • 是的,Wald 的论文帮了一些忙。我得到的是,您通过 SSE 或 GPU 使用 SIMD 将相干光线投射到数据包中。我不明白的是,当其中一条射线击中时会发生什么。有什么分支吗?或者其余的平行光线是否继续行进直到它们也停止,此时整个 SIMD 操作终止?更重要的是——如果是这样的话,为什么不对发散光线进行 SIMD——光线数据就是“MD”。
    • 我过去的做法是通过位域来跟踪哪些光线是“活跃的”;如果光线没有穿过树中的分支,则清除它的位。当没有任何光线处于活动状态时,您可以停止遍历当前分支。当你到达一片叶子时,你可以投射所有的光线,或者只投射活跃的光线,无论你认为哪个更快(因为不活跃的光线不应该击中)。你的光线越连贯,它们就越有可能通过树中的相同节点并击中相同的三角形,避免额外的数据获取。
    猜你喜欢
    • 2012-12-11
    • 2013-07-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2010-10-21
    • 2019-10-28
    • 2011-08-29
    • 2017-03-26
    相关资源
    最近更新 更多