C ++ - 动态阴影投射

时间:2014-02-28 01:37:20

标签: c++ algorithm shadow

我正在为学校做一个游戏项目,我遇到了照明问题。我已经阅读了很多教程和主题,似乎没有一个对我有用。我可以制作的唯一可行的算法是通过使用光线投影来强制线条(这显然导致了 帧率问题等)。将阴影投影到2D平面上的最佳方法是什么?

1 个答案:

答案 0 :(得分:4)

如果您正在使用类似OpenGL的内容,那么有很多关于这个主题的教程。如果您正在编写自己的渲染器,则需要做更多的工作,尽管适用相同的原则。

有许多方法可以获得阴影,但很多方面取决于您的需求和计算能力。我会说最常用的两种方法是

  1. 光线跟踪阴影
  2. 阴影地图
  3. 在我看来,

    光线跟踪阴影更容易理解和实施。基本上在对像素着色时,将光线投射到光源,其中最大光线长度是光线的距离。如果光线没有碰到任何东西,那么您要着色的点将被视为不在阴影中。如果光线撞击距离小于到光线的距离,则它处于阴影中。用简单的英语你可以把它想象成,如果我的眼睛要位于这个世界的这个位置,我是否能直接看到光线?

    这种方法可以为您提供完美的硬边阴影。这是因为光源被认为是无限小的。当你想要柔和阴影或聚光灯锥角衰减时,它可能会变得更复杂。

    到目前为止,

    阴影贴图是实时/游戏应用程序中常用的,但随着新机器核心数量的增加,我相信阴影贴图的相关性会越来越低。< / p>

    这是一个关于OpenGL中的阴影映射的教程,但其概念与您在任何其他渲染系统中找到的概念相同。 http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/

    简而言之,阴影贴图只是从光源的角度渲染3D场景,但不是存储场景中对象的颜色,而是存储深度值。然后,当您从相机的视角渲染时,您可以使用阴影贴图作为深度值的查找。您从相机的视角着色的点需要转换为用于生成阴影贴图(或深度图像)的相同视图/投影矩阵的空间,因此您知道像素在哪里如果从光的角度渲染,则为阴影。

    阴影贴图往往占用更多内存,通常比光线追踪更快。 光线追踪几乎不占用任何记忆,可以很容易地穿线,但如果场景有很多几何形状,那么投射光线的速度成本会非常昂贵。

    还有很多方法可以添加阴影,但如果没有更多关于你想要的细节,就很难指明方向。例如,如果您只想在游戏中角色下面有一个暗区,则可以使用带有圆形渐变的精灵来伪造阴影。精灵阴影非常快,但看起来不正确,除非你的地板完全平坦。如果您想在平面上获得准确的阴影,您还可以使用投影阴影,您基本上使用光线投射将几何体从灯光位置投影到地板上,并将其渲染为黑色。但同样,这实际上取决于您的需求。您可能希望通过有关项目的更多细节来更新您的问题。