许多关于光线追踪的特定资源都说明了:
“射击光线,找到切割它的第一个障碍”
“射击二次射线......”
“或者,反向和近似/插值”
我没有看到任何使用扩散算法的algortihm。让我们假设点光源是一个比其他单元格更密集的点(所有空间被划分为单元格),每个步骤/迭代的光照/跟踪使得源点使用速度场扩散到邻居中,而不是它们的邻居和继续那样。经过一些令人满意的迭代(例如30-40次迭代)后,每个单元格的密度信息用于启动该单元格中的对象。
点光源和速度场:
但它必须像1000x1000x1000大小,这需要花费太多时间和内存来计算。也许只是计算10x10x10并且在找到障碍物时,将该区域划分为100x100x100(以动态kd树方式)可以帮助生成可接受分辨率的光照/阴影?特别是对于基于顶点的照明而不是三角形。
有没有人尝试过这种方法?
注意:速度场在此处使光线大部分向外扩散(不是%100而是%99以具有一些全局照明)。有限元方法可以使这种难以平行。
编辑:任何被正密度击中的物体都会成为在其表面周围生成新速度场的障碍。因此,光不能通过该物体,但可以反射到另一个方向。(如果它是一个透镜物体,而不是通过光线漫射更难)因此光的反射会影响具有更高迭代限制的其他物体
可以在对象碰撞算法中使用相同的kd-tree:)
只需要作为一粒盐:神经网络可以在30x30x30网格中训练平流和扩散,并且可以用于“gpu(opencl / cuda) - >神经网络 - - >有限元方法--->阴影“方式。
答案 0 :(得分:1)
目前存在一些问题。
第一个问题是,从根本上说,牛顿意义上的光子不会根据周围其他光子的密度做出反应或改变。因此,使用密度字段并尝试点亮以遵循经典的Navier-Stokes样式解决方案(这是您尝试做的,基于您给出的密度字段解释)将导致不正确的结果。如果有足够的迭代次数,它也会在场景中产生完整的熵,这也不会发生在光线上。
即使您要解决密度问题,您仍然会遇到同一个单元中多个光子向不同方向发生的问题,这是全局照明和漫反射照明所必需的。
因此,剥离你想法中的问题部分,你留下的是一个光子粒子系统:P
现在,公平地说,sudo-particle系统目前用于全球照明解决方案。这种类型的东西称为光子映射,但使用它实现直接照明解决方案很简单:P