我不确定这是否可行,但值得一试。我正在使用模板缓冲区来减少使用此算法的延迟渲染器中光量的过度绘制(当相机在体积之外时):
- 使用便宜的着色器,绘制深度测试设置为 LEQUAL 的背面,在模板缓冲区中标记它们。
- 使用昂贵的光照着色器,绘制深度测试设置为 GEQUAL 的正面。
这将导致只有光体积内的像素被着色。绘制多个灯光时会出现问题。首先,由于状态更改代价高昂,因此在每个灯光的廉价和昂贵着色器之间反复切换可能不是最好的主意。理想情况下,我想通过使用廉价着色器渲染 8 个光量,然后使用昂贵的着色器渲染 8 个光量来利用模板缓冲区的所有 8 位。但是,当灯光重叠时会出现问题,因为无法分辨哪些像素属于哪些灯光。
想到的解决方案是在每个灯的模板缓冲区中使用 1 位。因此,对于 light n,在廉价通道中标记模板缓冲区中的第n位,然后在昂贵通道期间仅渲染具有该位的像素。
我以前没有使用过模板缓冲区,但从我读到的内容来看,这似乎是不可能的。为此,我必须使用按位 OR 设置模板缓冲区,并且模板函数必须是按位 AND。但是,我可以看到的模板缓冲区上的唯一操作是:KEEP、ZERO、REPLACE、INCR、DECR 和 INVERT,唯一的功能是:NEVER、ALWAYS、LESS、EQUAL、LEQUAL、GEQUAL、GREATER 和 NOTEQUAL。
有没有办法使用模板缓冲区以某种方式获得这种 OR 和 ANDing 行为?如果没有,是否有另一种方法可以有效地渲染光量?