如何在OpenGL中使用“AND”模板?

时间:2013-04-20 13:54:28

标签: opengl stencil-buffer

我有一个场景渲染,我正在进行一些仅在屏幕的一部分上进行的后期处理。我使用球体来切割"切割"该地区,但我得到了#34;完整的"球体,而我需要" AND"切割球体内的表面。这有点难以解释,但希望以下两个模型有所帮助。让我们说场景是蓝色的,绿色的球体是模板网格。右图显示了生成的模板。

所以......我怎么能这样做?目前我做的是这样的事情:

GL.Enable(EnableCap.DepthTest);
GL.ColorMask(false, false, false, false);
GL.CullFace(CullFaceMode.Front);

GL.Enable(EnableCap.StencilTest);
GL.Clear(ClearBufferMask.StencilBufferBit);

GL.StencilFunc(StencilFunction.Always, 1, 1);
GL.StencilOp(StencilOp.Incr, StencilOp.Incr, StencilOp.Incr);

Resources.R.StencilMesh.Render();

GL.StencilFunc(StencilFunction.Equal, 1, 1);
GL.StencilOp(StencilOp.Keep, StencilOp.Keep, StencilOp.Keep);

然而,这会产生一个带有完整球体的模板缓冲区,而我只想要留在球体内的表面。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,那么在你第一次打电话给glStencilOp时,我认为你的参数错误。

这三项行动分别是:

  1. 模板测试失败时该怎么办
  2. 模板测试通过时的操作,深度测试失败
  3. 模板和深度测试通过后该怎么办。
  4. 由于你的模板测试总是通过,我们可以忽略#1,但如果你只想在模板缓冲区中绘制球体将被绘制的位置(并且没有填充深度缓冲区遮挡的区域),应该增加情况#2中的模板缓冲区。

    所以我会尝试:

    GL.StencilFunc(StencilFunction.Always, 1, 1);
    GL.StencilOp(StencilOp.Keep, StencilOp.Keep, StencilOp.Incr);
    Resources.R.StencilMesh.Render();