3d 光线跟踪-软阴影

3d 光线跟踪-软阴影,3d,shadow,raytracing,3d,Shadow,Raytracing,我正在为一个学校项目实施我自己的ray tracer,作为iPad应用程序。目前的结果是: 我需要添加最后一个要求,软阴影,但我在任何地方都找不到完整的参考。如果我理解得很好,为了实现这个特性,我必须从一个交点向mt光源发射许多光线。这个一定是区域灯。假设我使用一个球体,我的问题是: 我必须使用球体上的哪个点来计算阴影光线 我如何平均结果 您正站在一个点p处,该点的局部表面法线为N,需要找出从球形光源L到达的照明,中心C悬挂在地平线上方,均匀且愉快地在可见频率上辐射能量。要获得软阴影,您需要

我正在为一个学校项目实施我自己的ray tracer,作为iPad应用程序。目前的结果是:

我需要添加最后一个要求,软阴影,但我在任何地方都找不到完整的参考。如果我理解得很好,为了实现这个特性,我必须从一个交点向mt光源发射许多光线。这个一定是区域灯。假设我使用一个球体,我的问题是:

  • 我必须使用球体上的哪个点来计算阴影光线
  • 我如何平均结果

您正站在一个点p处,该点的局部表面法线为N,需要找出从球形光源L到达的照明,中心C悬挂在地平线上方,均匀且愉快地在可见频率上辐射能量。要获得软阴影,您需要向L上的不同点发送多条遮挡检测器光线(阴影触角),但我们要做的不仅仅是这些

这张图片清楚地表明,直射光只能从半球HF到达p,因此它是球体中唯一需要采样的部分-向其发送阴影探测器-以便准确评估L对p处照明的贡献。然而,尽管在球体上生成点很简单,这里我们只有一个半球,它不一定与任何世界坐标轴对齐,这使数学变得复杂。但真正的问题在其他地方——如果我们对HF进行均匀采样,我们将对其正面朝向P的部分和几乎侧面朝向P的部分给予同等对待。这是一种浪费,最好将计算集中在向P输送更多能量的区域

我们快速观察到,所有这些暗影触角实际上都指向与L共用中心的圆盘D(即L的大圆),并且与连接p和C的线正交

这意味着,我们不需要在HF上生成点,而可以在D盘上生成点,这不仅简单,而且——假设D盘上的点分布均匀——可以保证HF上的阴影探测器密度与区域的潜在贡献成局部比例,很好地解决了上述问题

另一种方法是,你需要在一个以p为顶点,以D为底的圆锥体内生成光线

总而言之:

  • 假设从L到P到达的总光量E。你可以根据L到P之间的距离,L到P的角度扩展,或者更复杂的东西来计算
  • 从P向圆盘D生成一组M条随机、均匀的阴影光线
  • 如果射线R在击中L之前与任何物体相交,则沿此路径没有能量转移
  • 否则:
    • 将E/M乘以P和(归一化)R处法向量N的点积
    • 将结果添加到迄今为止传输的灯光
  • 对所有M射线重复此操作
  • 要做的事情:优化(检测L是否完全/部分在局部地平线下,随着L在p上的角度扩展改变M,使用分层和/或自适应采样,缓存遮挡器命中等)


    注:以上假设和简化了很多,从光度角度来看是不正确的,但对于iPad光线跟踪器来说应该是正确的。

    谢谢。最后我做到了。现在我有另一个问题。看这里。你能帮我也做这个零件吗?