许多关于光线追踪的特定资源都讲述了:
“射出射线,找到第一个障碍物来切断它”
“射出二次射线……”
“或者,反向并近似/插值”
我没有看到任何使用扩散算法的算法。让我们假设一个点光源是一个比其他单元格密度更高的点(所有空间都被划分为单元格),照明/跟踪的每一步/迭代都使该源点使用速度场扩散到邻居中,而不是他们的邻居和继续这样。经过一些令人满意的迭代(如 30-40 次迭代)后,每个单元格的密度信息用于对该单元格中的对象进行光照。
点光和速度场:
但它必须是 1000x1000x1000 大小,这将花费太多时间和内存来计算。也许只是计算 10x10x10 并且在找到障碍物时,将该区域划分为 100x100x100(以动态 kd-tree 方式)可以帮助生成可接受分辨率的照明/阴影?特别是对于基于顶点的照明而不是三角形。
有没有人尝试过这种方法?
注意:这里的速度场是为了使光线主要向外扩散(不是 %100 而是 %99 以获得一些全局照明)。有限元方法可以使这个令人尴尬的并行。
编辑:任何被正密度击中的物体都将成为在其表面周围产生新速度场的障碍。所以光不能穿过那个物体,但可以镜像到另一个方向。(如果它是一个透镜物体,比光更难通过它)所以光的反射会影响具有更高迭代限制的其他物体
相同的 kd-tree 可用于对象碰撞算法 :)
只是作为一粒盐:可以训练神经网络在 30x30x30 网格中进行平流和扩散,并且可以在“gpu(opencl/cuda)--> 神经网络 ---> 有限元方法中使用 - -->阴影”的方式。