OpenGL模板缓冲区OR操作?

Gum*_*mgo 7 opengl bit-manipulation volume light stencil-buffer

我不确定这是否可行,但值得一试.我正在使用模板缓冲区来减少使用此算法的延迟渲染器中的光量过度绘制(当摄像机位于卷外时):

  1. 使用便宜的着色器,将深度测试设置为LEQUAL的背面绘制,在模板缓冲区中标记它们.
  2. 使用昂贵的照明着色器,将正面深度测试设置为GEQUAL.

这将仅导致光量内的像素被着色.绘制多个灯时会出现问题.首先,由于状态变化很昂贵,因此对于每种灯光反复在廉价和昂贵的着色器之间切换可能不是最佳选择.理想情况下,我想利用模板缓冲区的所有8位,通过使用廉价着色器渲染8个轻量级,然后使用昂贵的着色器渲染8个轻量级.但是,当灯光重叠时会出现问题,因为无法分辨哪些像素属于哪些灯光.

想到的解决方案是每个灯在模板缓冲区中使用1位.因此,对于光n,在廉价通道中标记模板缓冲区中的第n位,然后在昂贵的通过期间仅渲染具有该位的像素.

我之前没有使用模板缓冲区,但从我正在阅读的内容看起来似乎不太可能.为此,我必须使用按位OR设置模板缓冲区,并且模板函数必须是按位AND.但是,我可以看到的模板缓冲区上的唯一操作是:KEEP,ZERO,REPLACE,INCR,DECR和INVERT,唯一的功能是:NEVER,ALWAYS,LESS,EQUAL,LEQUAL,GEQUAL,GREATER和NOTEQUAL.

有没有办法以某种方式使用模板缓冲区获得此OR和AND行为?如果没有,是否有另一种方法可以有效地渲染光量?

dav*_*ave 6

要获得ORing更新行为,请glStencilMask结合使用GL_REPLACE.要获得ANDing测试行为,请使用glStencilFunc mask与之结合的参数GL_EQUAL.在这两种情况下,你会希望ref参数glStencilFunc0xff.