是否有简单的数学解决方案来对磁盘区域光进行采样? (光线追踪)

我正在尝试在用C语言编写的光线跟踪器中实现不同类型的光源。我已经成功实现了点光源,点光源,定向光源和矩形区域光源。

对于矩形区域光,我在空间中定义了两个向量(U和V),并使用它们移动到它们形成的虚拟(定界)矩形中。 根据光的强度,我在矩形上进行几个采样,然后计算到达一个点的光量,就好像每个采样都是一个点光源。

是否有简单的数学解决方案来对磁盘区域光进行采样? (光线追踪)

使用矩形很容易找到各种样本的位置,但是当我尝试使用圆盘灯进行相同操作时,事情变得很复杂。 我发现有关此方面的文档很少,而且大多数文档已经使用现成的函数来实现。 我发现的唯一有趣的事情是此文档(https://graphics.pixar.com/library/DiskLightSampling/paper.pdf),但是我无法利用它。

您知道如何使用向量运算来帮助我达到下图的类似结果吗? (例如,具有圆盘的原点,方向,半径和样本数)

是否有简单的数学解决方案来对磁盘区域光进行采样? (光线追踪)

在这方面的任何建议或文档都会对我有很大帮助。

fgtfer 回答:是否有简单的数学解决方案来对磁盘区域光进行采样? (光线追踪)

这个问题简化为:

  

如何选择磁盘上均匀分布的随机点?

一种幼稚的方法是生成随机polar coordinates并将其转换为笛卡尔坐标:

  1. θ0之间随机产生一个角度
  2. 随机生成d与磁盘半径0之间的距离r
  3. 使用x = r cos θy = r sin θ转换为笛卡尔坐标

这是不正确的,因为它导致点在中心聚集。例如:

Incorrect uniform disk sampling

一种正确但效率低下的方法是通过rejection sampling

  1. x上均匀生成随机的y[0,1]
  2. 如果sqrt(x^2 + y^2) < 1,则返回该点
  3. 转到1

disk rejection sampling

说明正确的方法here

  1. θ0之间随机产生一个角度
  2. 随机生成d与磁盘半径0之间的距离r
  3. 使用x = sqrt(r) cos θy = sqrt(r) sin θ转换为笛卡尔坐标
本文链接:https://www.f2er.com/3121667.html

大家都在问