【问题标题】:Is there an easy way to get shadows in OpenGL?有没有一种简单的方法可以在 OpenGL 中获得阴影?
【发布时间】:2011-04-20 10:16:13
【问题描述】:

我最近创建了一些景观代码并为场景添加了一些漫反射照明,但令我失望的是,没有阴影。我在网上看了好几个小时,寻找在 OpenGL 中获得阴影的方法,但它们看起来都非常复杂;并且对他们自己的演示程序非常独特。

有没有简单的方法来制作阴影?

【问题讨论】:

  • 并非如此。阴影没有内置到管道中。您必须自己生成它们(有很多方法可以做到这一点,每种方法都有自己的优缺点)并自己渲染它们。
  • OpenGL 不做阴影,它渲染每个点,就好像点和光源之间没有阻碍一样
  • 除非您想学习图形编程的内部知识,否则您可能希望使用图形引擎(例如 Horde3D)或游戏引擎(Ogre 或 Irrlicht)而不是纯 OpenGL。它可以让你免于重新发明轮子(嗯,可能有很多轮子),让你直接跳入你想要实现的目标。 OpenGL 是一个低级 API。

标签: c++ opengl terrain shadows


【解决方案1】:

没有。光栅化在这方面非常糟糕(即使是最近的 AAA 游戏也有明显的阴影伪影),但每个人都忍受它。

解决方案包括(大约从最简单/最差到最好/最难):

  • 没有阴影。只需用较深的颜色来解释遮挡。 xNormalBlender
  • 如果您想要角色的近似阴影,地面上具有透明和模糊纹理的简单平面多边形就可以了。例如,参见塞尔达截图。甚至最近的一些游戏仍在使用它。
  • 光照贴图。仅静态几何,但完美的照明(预先计算)。实施起来相当简单。存在很多工具。
  • 影子卷,由卡马克推广。像素完美,实现起来相当简单,速度很慢。适合一些对象。没有柔和的阴影。
  • 阴影贴图。如果您从未制作过任何 openGL,则有点难以实现。很难做对。像素化阴影。处理大量多边形。不处理大世界。
  • 无数阴影贴图变体。这几年研究很多。目前最好的是级联阴影贴图:很难,仍然很难让它看起来不错,但速度很快,可以处理大量的多边形和巨大的世界。
  • 光线追踪阴影:这可能是下一代。除了一些研究论文,没有人真正使用它。非常复杂,在动态世界中表现不佳(还),巨大的静态场景还可以。像素完美或柔和阴影,取决于您有多少备用 GPU。 Several variants;截至 2014 年,这仍然没有在任何游戏中出现 for performance reasons

因此,通常的技巧是将漂亮但仅静态的方法与动态但不那么好的方法混合。例如,请参阅我在 lightmappingshadowmapping 上的教程。

【讨论】:

  • 如果您想通过静态太阳获得山脉的阴影,光照贴图是不错的选择。将您的地图导出为任何 3D 格式,在 Blender 中打开,按照任何教程进行操作:您已经获得了光照贴图。使用着色器与纹理混合(如果你很懒,直接在 Photoshop 中),你就完成了。
  • 对不起,我的书呆子让我评论:影子卷是由弗兰克克劳于 1977 年首次提出的。它们是一种技术,例如 BSP 树或您看到的快速平方根,卡马克已经在游戏中普及,但绝对不是发明的。
  • 感谢您的评论,我不知道。消息已相应更新。
  • 我只想指出,在虚幻引擎 4 中,实时阴影并不是真正的“研究”。决定它是否适合您。
  • 如果您指的是 UE4 使用的 Crassin 的论文,体素仅用于辅助“射线”。还有一个阴影贴图。
【解决方案2】:

没有。

我所知道的最简单的方法是使用预生成的阴影纹理,该阴影纹理使用多重纹理覆盖在地形上。复杂的部分是生成这个纹理,但如果你不使用定向照明,一个简单的“大模糊点”通常总比没有好。

【讨论】:

  • 哦,更简单的方法是使用已经内置的引擎,但我假设您对仅为其他人的引擎构建模型不感兴趣(很公平,我也不是) .
  • 不,我不想为别人的引擎构建模型。至于上面的答案,我在哪里可以找到如何做到这一点?
  • 任何关于多重纹理的基本介绍都会涵盖它。诀窍是设置要包裹的纹理(带有透明边缘)并使用地形上的 UV 参数定位它。或者,您可以为阴影制作一个额外的表面,这在平坦的表面上很容易,但在地形上会涉及更多...
  • 另外,如果您想要地形阴影,最简单的方法是将您的高度图(假设黑色最低)转换为纹理并将其应用于整个地形。我的答案来自“为角色提供阴影”POV,而不是添加地形阴影。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
相关资源
最近更新 更多