c++ - 有没有一种简单的方法可以在 OpenGL 中获得阴影?

标签 c++ opengl terrain shadows

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

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

最佳答案

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

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

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

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

关于c++ - 有没有一种简单的方法可以在 OpenGL 中获得阴影?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3849052/

相关文章:

c++ - 将顶点缓冲区对象附加到顶点数组对象

c++ - 如何对 QMap<QString, myStruct> 进行排序?

c++ - OpenGL将纹理四边形渲染为(0,0)的单个像素?

c++ - 使用顶点缓冲对象的 OpenGL 快速纹理绘制。这是这样做的方法吗?

Android - 根据周围的瓦片确定瓦片位图

c++ - 迭代前序遍历(调试)

c++ - 二叉查找树递归显示函数,不知道是怎么实现的?

c++ - 编译使用 OpenGL 的代码时找不到 libGLESv2.dll

javascript - WebGL 地形网格在 128 像素后缩小

javascript - 如何让相机跟随本示例中的地形高度 : http://threejs. org/examples/#webgl_terrain_dynamic