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