【问题标题】:Ray Tracing Calculations光线追踪计算
【发布时间】:2012-05-23 23:23:37
【问题描述】:

我正在尝试进行一些涉及光线追踪的计算,但有点困惑。假设我有一个 n×n 图像,其中包含 N 个几何图元、l 个光源和 k x k 超级采样。在最坏的情况下,我将计算多少个射线交点?如果我添加深度为 d 的反射/折射会怎样?

【问题讨论】:

    标签: math graphics raytracing


    【解决方案1】:

    您必须为图像的 n x n 像素中的每一个发射 k x k 射线。对于这些射线中的每一个,您都必须进行碰撞测试,这会以一种非常简单且低效的方式转化为 N 次比较(每次都取决于基元的复杂性)。现在,如果这些光线中的任何一条射到镜面或半透明表面,您必须拆分光线并递归调用。但是,这一次您不进行超级采样,因此您只需在反射/折射方向发送一束光线。对于深度 d,您将发送该数量的额外光线,每个递归调用一条。

    所以,总共:k^2 x n^2 x d。

    这还不包括相交计算,它不会增加任何光线,但会增加很多复杂性。

    但是,有许多简化。

    • 自适应多重采样,减少 k^2 因子。
    • 像素插值,减少 n^2 因子。
    • 使用一些空间分区结构,例如 BSP 和/或 OctTree 进行碰撞测试。
    • 使用一些启发式方法来减少递归。

    【讨论】:

    • 很抱歉,您想要什么样的例子?这个问题没有说明实施,所以我不知道要提供什么例子。如果是关于我提到的优化,那可能是另一个问题的主题。无论如何,非常感谢您的投票。
    【解决方案2】:

    但这并不是一个完整的答案...... 请参阅这篇文章:http://blogs.msdn.com/b/lukeh/archive/2007/10/01/taking-linq-to-objects-to-extremes-a-fully-linqified-raytracer.aspx 您可能会利用修改后的一些计数代码来在您进行跟踪时自动将这些统计信息提供给您:P

    【讨论】:

    • 虽然不完全是答案,但它确实给出了一个非常有趣的例子,以一种奇怪而有趣的方式。我自己发现 LINQ 的这种用法非常令人印象深刻。
    • 如果您认为这令人印象深刻,请查看我的 JavaScript 版本。说真的;谢谢你的好话,先生,不知怎的,我觉得我不配得到他们,但我会非常温顺地接受他们。非常感谢
    猜你喜欢
    • 2012-11-13
    • 1970-01-01
    • 2016-08-23
    • 2014-12-30
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多