algorithm - 最快的阴影算法是什么(仅限 CPU)?

标签 algorithm 3d rendering shader occlusion-culling

假设我有一个 3D 模型:

enter image description here

模型以顶点、面(所有三角形)和法向量的形式给出。该模型可能有孔和/或透明部分。

对于无限远任意放置的光源,我必须确定:

  • [必填]哪些三角形(部分)被其他三角形遮挡

然后,对于部分阴影的三角形:

  • [奖励]三角形面积的多少部分被阴影覆盖
  • [ super 奖励]提出了一个新的网格,可以准确地描述阴影的形状

我的最终应用程序必须在 headless 机器上运行,也就是说,它们没有 GPU。因此,OpenGL、OpenCL 等所有标准的东西可能不是最好的选择。

考虑到这一限制,确定这些事情的最有效算法是什么?

最佳答案

您有单个网格还是多个网格?

这意味着阴影是否转换在单个“地面”表面上或者更像房间墙壁甚至物体附近。根据此信息,解决方案非常不同

  1. 适用于平坦的地面/墙壁表面

    通常是投影渲染到该表面的最佳方式

    shadow projection

    相机方向与光线法线相反,屏幕是渲染到表面的。表面通常不垂直于光线,因此您需要使用投影来补偿...每个目标表面都需要 1 个渲染 channel ,因此如果将阴影投影到近网格上(仅适用于地面/墙壁),则不适合

  2. 适用于更复杂的场景

    您需要使用更高级的方法。它们有很多,每种都有其优点和缺点。我会使用体素贴图,但如果您受到空间的限制,那么一些模板/矢量方法会更好。当然,所有这些技术都非常昂贵,如果没有 GPU,我什至不会尝试实现它们。

    这就是体素图的样子:

    shadow voxel map

    如果您只想自阴影,那么体素贴图大小可以只是网格周围的一些边界框,在这种情况下,您不会合并整个网格体积,而只是将每个像素投影到光线方向(忽略第一个体素...)以避免光照表面上的阴影

关于algorithm - 最快的阴影算法是什么(仅限 CPU)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22347296/

相关文章:

three.js - 如何用三个js将多个纹理剪辑为多边形

algorithm - 如何计算两个单词之间的 "shortest distance"?

algorithm - 将一条通过原点 (0,0) 的直线拟合到数据

javascript - 在 THREE.js 中,如何将一个纹理映射到 3D 矩形

jquery - CSS 旋转立方体在立方体上进行 translateZ 后不起作用

opengl - 如何按中心旋转立方体

wpf - 提高 WPF UI 渲染速度的方法

algorithm - 求树径的线性算法

python - 如何有效地在屏幕上准确地绘制 N 个点?

javascript - 通过递归查找多维数组的最后一个满足条件的元素