假设我有一个 3D 模型:
模型以顶点、面(所有三角形)和法向量的形式给出。该模型可能有孔和/或透明部分。
对于无限远任意放置的光源,我必须确定:
- [必填]哪些三角形(部分)被其他三角形遮挡
然后,对于部分阴影的三角形:
- [奖励]三角形面积的多少部分被阴影覆盖
- [ super 奖励]提出了一个新的网格,可以准确地描述阴影的形状
我的最终应用程序必须在 headless 机器上运行,也就是说,它们没有 GPU。因此,OpenGL、OpenCL 等所有标准的东西可能不是最好的选择。
考虑到这一限制,确定这些事情的最有效算法是什么?
最佳答案
您有单个网格还是多个网格?
这意味着阴影是否转换在单个“地面”表面上或者更像房间墙壁甚至物体附近。根据此信息,解决方案非常不同
适用于平坦的地面/墙壁表面
通常是投影渲染到该表面的最佳方式
相机方向与光线法线相反,屏幕是渲染到表面的。表面通常不垂直于光线,因此您需要使用投影来补偿...每个目标表面都需要 1 个渲染 channel ,因此如果将阴影投影到近网格上(仅适用于地面/墙壁),则不适合
适用于更复杂的场景
您需要使用更高级的方法。它们有很多,每种都有其优点和缺点。我会使用体素贴图,但如果您受到空间的限制,那么一些模板/矢量方法会更好。当然,所有这些技术都非常昂贵,如果没有 GPU,我什至不会尝试实现它们。
这就是体素图的样子:
如果您只想自阴影,那么体素贴图大小可以只是网格周围的一些边界框,在这种情况下,您不会合并整个网格体积,而只是将每个像素投影到光线方向(忽略第一个体素...)以避免光照表面上的阴影
关于algorithm - 最快的阴影算法是什么(仅限 CPU)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22347296/