代码之家  ›  专栏  ›  技术社区  ›  Gumgo

OpenGL模具缓冲区还是操作?

  •  7
  • Gumgo  · 技术社区  · 14 年前

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

    1. 使用一个便宜的明暗器,将深度测试设置为lequal,并在模具缓冲区中标记这些面。
    2. 使用昂贵的灯光明暗器,绘制前表面,深度测试设置为gequal。

    这将仅使光体积中的像素着色。当绘制多个灯光时,会出现此问题。首先,由于状态更改的代价很高,因此对于每个灯光重复在廉价和昂贵的明暗器之间切换可能不是最好的主意。理想情况下,我想利用模板缓冲区的所有8位,先用便宜的明暗器渲染8个光体积,然后用昂贵的明暗器渲染8个光体积。然而,当灯光重叠时会出现问题,因为无法分辨哪些像素属于哪些灯光。

    我们想到的解决方案是在每盏灯的模板缓冲区中使用1位。所以,对于光 n ,标记 n 在模具缓冲区中的th位在便宜的过程中,然后在昂贵的过程中只渲染带有该位的像素。

    我以前没有使用过模板缓冲区,但从我读到的内容来看,这似乎是不可能的。为了实现这一点,我必须使用按位或设置模具缓冲区,模具函数必须是按位和。但是,我能看到的模具缓冲区上的唯一操作是:keep、zero、replace、incr、decr和invert,并且唯一的函数是:never、always、less、equal、lequal、gequal、greater和notequal。

    是否有任何方法可以通过模板缓冲区来获得这种或和anding行为?如果没有,是否有其他方法可以有效地渲染光体积?

    1 回复  |  直到 14 年前
        1
  •  6
  •   dave    14 年前

    要获取ORing更新行为,请使用 glStencilMask 结合 GL_REPLACE . 要获得安定测试行为,请使用 glStencilFunc mask 参数与 GL_EQUAL . 在这两种情况下,您都需要 ref 参数 GL模板功能 成为 0xff .