【问题标题】:OpenGL stencil buffer OR operation?OpenGL模板缓冲区或操作?
【发布时间】:2011-04-16 04:09:30
【问题描述】:

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

  1. 使用廉价的着色器,绘制深度测试设置为 LEQUAL 的背面,并在模板缓冲区中标记它们。
  2. 使用昂贵的光照着色器绘制正面,并将深度测试设置为 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


    【解决方案1】:

    要获得 ORing 更新行为,请将 glStencilMaskGL_REPLACE 结合使用。要获得 ANDing 测试行为,请将 glStencilFunc mask 参数与 GL_EQUAL 结合使用。在这两种情况下,您都希望glStencilFuncref 参数为0xff

    【讨论】:

    • 太棒了!这正是我一直在寻找的。非常感谢!
    猜你喜欢
    • 2011-03-09
    • 2018-06-23
    • 2012-07-11
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    相关资源
    最近更新 更多