2

假设我有一个 3D 模型:

在此处输入图像描述

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

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

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

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

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

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

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

4

1 回答 1

2

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

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

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

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

    阴影投影

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

  2. 对于更复杂的场景

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

    这就是体素贴图的样子:

    阴影体素贴图

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

于 2014-03-13T09:13:01.977 回答