如何在延迟着色系统中实现光遮挡
How to implement light occlusion in deferred shading system?
我正在实现一个延迟着色系统,该系统使用计算着色器(在DirectX 11中(来剔除瓦片中的灯光,因此我可以以稳定的帧速率获得数千个灯光。当我必须确定灯光是否被场景几何体遮挡时,问题就来了。我是说我的聚光灯穿过墙壁和桥梁。我在主光源(太阳(的视点上有一个阴影贴图,但为场景中的每个点光源生成阴影贴图需要生成一千个立方体,这是不可能的。那么这个问题通常是如何处理的呢?像《死亡空间3》和《战地3》这样的游戏在场景中有很多灯光,但它们不会通过固体物体流血。
一个直接的解决方案是使用屏幕空间环境遮挡方法。在那里,您可以尝试基于邻域的采样来估计遮挡。我知道的一种方法是SSDO,它直接针对屏幕空间中的阴影创建。也许你最终会在复杂的场景中看到很多人工制品。优点是SSDO还添加了一些全局照明效果。
我认为大多数游戏/引擎都试图通过预处理步骤来克服这些问题。
-
静态照明:如果光源不移动(建筑物中的灯光…(,则计算光照贴图或包含灯光的一些额外顶点属性。
-
调整灯光:只需调整衰减距离、强度或位置,直到没有明显的出血。
-
一些自己的想法:根据你对光的表示(球体/圆盘?(,你可以计算出光的修剪形状。墙后的像素不会位于新的光量内,也不会以这种方式点亮。如果你不能任意塑造你的光量,你可能可以为每个定义灯光的墙添加一到两个平面。对于大多数灯光,这些平面可以是未定义的,并且仅对于墙附近的灯光,可以推送到GPU。然后,可以在各个光的发光过程中检查像素位于哪一侧。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- 如何在延迟着色系统中实现光遮挡