【问题标题】:Point light shadow mapping and lighting shader点光阴影映射和光照着色器
【发布时间】:2014-04-18 11:31:51
【问题描述】:

我正在做全方位的阴影贴图,但我无法掌握的一件事是在光照阶段,如何获取矢量以用于对立方体贴图进行采样?

在阴影通道中,我只使用深度值,所以我现在需要在同一个空间中。但是我怎么知道要使用六个视图矩阵中的哪一个(因为每个面一个)来将世界空间位置转换为 NDC 空间?

例如,使用this 作为参考,查看片段着色器有一个“light_view_matrix”——但它是什么?光景矩阵……什么脸?我在阴影传递期间为每个面生成了一个。

【问题讨论】:

  • 如果您在世界空间中进行照明,则无需费心。顺便说一下,视图矩阵从世界空间转换到视图空间。您需要一个投影矩阵才能走得更远。

标签: c++ opengl shadow


【解决方案1】:

其实有一篇非常深入的关于可编程管线阴影映射的教程,查看Tutorial 16: Shadow mapping

网站上关于点光源的引述:

点光源

同样的事情,但使用深度立方体贴图。一个立方体贴图是一组 6 个纹理,一个立方体的每一侧都有一个;更重要的是,它不是通过标准的 UV 坐标来访问的,而是通过一个 3D 矢量>表示一个方向。

存储空间中所有方向的深度,这使得阴影可以>投射到点光源周围。

【讨论】:

  • 请注意指向立方体贴图中一个面与另一个面之间边缘的向量。传统上,在这种情况下,GPU 不会过滤来自多个立方体贴图面的纹素,如果您尝试实现硬件 PCF 或过滤的 VSM 之类的东西,您将在这些极端情况下得到非常奇怪的不连续性。不过,DX10 类硬件支持无缝立方体贴图。查看GL_TEXTURE_CUBE_MAP_SEAMLESS了解更多详情;即使在支持它的硬件上,它也默认禁用
  • 许多引擎实际上在立方体贴图阴影映射背后使用相同的基本概念,但它们不是将它们存储为实际的立方体贴图,而是展开为 2D 纹理并编写自己的特殊纹理查找函数。这有助于在 DX10 之前的硬件(例如 Xbox 360/PS3)上的立方体贴图面之间进行过滤,并且可以更轻松地将阴影贴图打包成一个巨大的图集。例如,CryEngine 就是这样做的。
猜你喜欢
  • 2016-02-27
  • 2011-08-31
  • 1970-01-01
  • 2013-08-23
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多