Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL模具缓冲区还是操作?_Opengl_Bit Manipulation_Volume_Light_Stencil Buffer - Fatal编程技术网

OpenGL模具缓冲区还是操作?

OpenGL模具缓冲区还是操作?,opengl,bit-manipulation,volume,light,stencil-buffer,Opengl,Bit Manipulation,Volume,Light,Stencil Buffer,我不确定这是否可行,但值得一试。我正在使用模具缓冲区来减少延迟渲染器中灯光体积的过度绘制,使用此算法(当相机位于体积之外时): 使用廉价的着色器,将“深度测试”设置为“LEQUAL”后绘制面,并在模具缓冲区中标记它们 使用昂贵的照明着色器,绘制深度测试设置为GEQUAL的正面 这将导致仅对灯光体积内的像素进行着色。绘制多个灯光时会出现此问题。首先,由于状态更改非常昂贵,因此对于每个灯光,反复切换便宜和昂贵的着色器可能不是最好的主意。理想情况下,我希望通过使用廉价着色器渲染8个光体,然后使用昂贵着

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

  • 使用廉价的着色器,将“深度测试”设置为“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


    是否有任何方法可以使用模具缓冲区以某种方式获得这种或和和行为?如果没有,是否有其他方法可以有效地渲染光体积?

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

    太棒了!这正是我想要的。非常感谢你!