我正在实现一个延迟着色系统,该系统使用计算着色器(在DirectX 11中)来剔除瓷砖中的灯光,因此我可以在稳定的帧速率下获得数千个灯光.当我必须确定灯光是否被场景阻挡时,问题就来了几何.我的意思是我的点光源穿过墙壁和桥梁.我在主光源(太阳)的视角上有一个阴影贴图,但是为场景上的每个点光源生成阴影贴图需要生成一千个立方体贴图,这就是那么这个问题通常是如何解决的?像死亡空间3和战地3这样的游戏在场景中有很多灯光,但它们不会通过固体物体流血. 最佳答案 一个直接的解决方案是使用屏幕空间环境遮挡方法.在那里,您尝试根据邻域的采样来估计遮挡.我所知道的一种方法是
SSDO,它直接针对在屏幕空间中创建阴影.可能你会在复杂的场景中得到很多文物.优点是
SSDO还增加了一些全局照明效果.
我认为大多数游戏/引擎都试图通过预处理步骤来克服这些问题.
>静态闪电:如果您的光源不能移动(建筑物中的灯光……),请计算光照贴图或包含光线的一些额外顶点属性.
>调整灯光:只需调整衰减距离或强度或位置,直到没有明显的出血.
>一些自己的想法:根据您对灯光的表示(球体/圆盘?),您可以计算灯光的修剪形状.墙后面的像素不会位于新的光量范围内,并且不会以这种方式照亮.如果你不能任意塑造你的光量,那么每个光定义墙壁可能会增加一个或两个平面.对于大多数灯光,这些平面可能是不确定的,只有在墙壁附近的灯光下才会被推到GPU上.可以检查在相应光的照明过程中它在哪一侧上的像素.