2

许多关于光线追踪的特定资源都讲述了:

“射出射线,找到第一个障碍物来切断它”

“射出二次射线……”

“或者,反向并近似/插值”

我没有看到任何使用扩散算法的算法。让我们假设一个点光源是一个比其他单元格密度更高的点(所有空间都被划分为单元格),照明/跟踪的每一步/迭代都使该源点使用速度场扩散到邻居中,而不是他们的邻居和继续这样。经过一些令人满意的迭代(如 30-40 次迭代)后,每个单元格的密度信息用于对该单元格中的对象进行光照。

点光和速度场:

在此处输入图像描述

但它必须是 1000x1000x1000 大小,这将花费太多时间和内存来计算。也许只是计算 10x10x10 并且在找到障碍物时,将该区域划分为 100x100x100(以动态 kd-tree 方式)可以帮助生成可接受分辨率的照明/阴影?特别是对于基于顶点的照明而不是三角形。

有没有人尝试过这种方法?

注意:这里的速度场是为了使光线主要向外扩散(不是 %100 而是 %99 以获得一些全局照明)。有限元方法可以使这个令人尴尬的并行。

编辑:任何被正密度击中的物体都将成为在其表面周围产生新速度场的障碍。所以光不能穿过那个物体,但可以镜像到另一个方向。(如果它是一个透镜物体,比光更难通过它)所以光的反射会影响具有更高迭代限制的其他物体

相同的 kd-tree 可用于对象碰撞算法 :)

只是作为一粒盐:可以训练神经网络在 30x30x30 网格中进行平流和扩散,并且可以在“gpu(opencl/cuda)--> 神经网络 ---> 有限元方法中使用 - -->阴影”的方式。

4

1 回答 1

1

就目前而言,这存在一些问题。

第一个问题是,从根本上说,牛顿意义上的光子不会根据周围其他光子的密度做出反应或改变。因此,使用密度场并尝试按照经典的 Navier-Stokes 风格解决方案进行照明(这是您正在尝试做的,基于您给出的密度场解释)会导致错误的结果。如果有足够的迭代,它也会导致场景中的完全熵,这也不是光发生的情况。

即使您要摆脱密度问题,您仍然会遇到多个光子在同一个单元中向不同方向传播的问题,这是全局照明和漫射照明所必需的。

所以,去掉你想法的问题部分,你剩下的是光子的粒子系统:P

现在,公平地说,sudo 粒子系统目前用于全局照明解决方案。这种类型的东西称为光子映射,但使用它实现直接照明解决方案很简单:P

于 2014-05-12T02:47:01.297 回答