gl_FragColor如何影响模板缓冲区?

时间:2017-01-19 17:48:26

标签: opengl fragment-shader stencil-buffer

我已将操作设置为绘制到模板缓冲区,类似于以下内容:

void onDisplay() {
  glClear(GL_DEPTH_BUFFER_BIT);
  glEnable(GL_STENCIL_TEST);
  glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
  glDepthMask(GL_FALSE);
  glStencilFunc(GL_NEVER, 1, 0xFF);
  glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP);

  // Draw to stencil buffer
  glStencilMask(0xFF);
  glClear(GL_STENCIL_BUFFER_BIT);  // needs mask=0xFF
  draw_circle();

  glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
  glDepthMask(GL_TRUE);
  glStencilMask(0x00);

  // draw where stencil's value is 0
  glStencilFunc(GL_EQUAL, 0, 0xFF);
  /* (nothing to draw) */
  // draw only where stencil's value is 1
  glStencilFunc(GL_EQUAL, 1, 0xFF);

  draw_scene();

  glDisable(GL_STENCIL_TEST);
}

现在,如果我在调用draw_circle()时启用了以下片段着色器(上图):

void main() {
  gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

如果我使用以下片段着色器,模板缓冲区的值将如何不同?

void main() {
  gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
}

换句话说,我想知道在绘制到模板缓冲区时片段着色器的输出如何影响模板缓冲区。

修改

我的问题是纠正我所知道的关于模板缓冲区的一些误解。我认为我的一个例子很好地解释了模板缓冲区[1]。这里提到以下内容:

  

glColorMask函数允许您指定在绘图操作期间将哪些数据写入颜色缓冲区。在这种情况下,您需要禁用所有颜色通道(红色,绿色,蓝色,alpha)。写入深度缓冲区需要单独禁用glDepthMask,这样立方体绘制操作不会受到矩形的剩余深度值的影响。这比以后再次清除深度缓冲区更清晰。

因此,从这个页面来看,为了写入模板缓冲区,需要启用/禁用适当的模式(即颜色和深度),然后通过整个光栅化过程< / em>,它只会写入模板缓冲区。由于光栅化过程包含片段着色器,片段着色器的输出(即gl_FragColor)是否被忽略?如何告诉GL 将什么写入模板缓冲区位置(x, y)

[1]:https://open.gl/depthstencils

1 个答案:

答案 0 :(得分:3)

除非您有权访问AMD / ARB_shader_stencil_export,否则片段着色器不能直接影响到模板缓冲区的输出。唯一的例外是discard片段。

根据this database,只有AMD卡提供此扩展名。此外,该扩展还专门为模板公开输出。它修改了the stencil value of the fragment;片段的颜色值决不会影响片段的模板值。