2

我渲染了一个场景,我正在做一些只在屏幕的一部分上进行的后期处理。我使用球体来“切割”该区域,但我得到了“完整”球体,而我需要对球体内部的表面进行“与”切割。这有点难以解释,但希望以下两个模型有所帮助。假设场景是蓝色的东西,绿色的球体是模板网格。右图显示了生成的模板。

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

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);

然而,这会导致模板缓冲区具有完整的球体,而我只想要留在球体内部的表面。

4

1 回答 1

1

如果我对您的理解正确,那么我认为您在第一次调用 glStencilOp 时参数错误。

这三个操作分别是:

  1. 模板测试失败时该怎么办
  2. 模板测试通过,深度测试失败怎么办
  3. 模板和深度测试通过后该怎么办。

由于您的模板测试总是通过,我们可以忽略 #1,但如果您只想在模板缓冲区中绘制球体将被绘制的位置(而不是填充深度缓冲区遮挡的区域),则不应增加案例 #2 中的模板缓冲区。

所以我会尝试:

GL.StencilFunc(StencilFunction.Always, 1, 1);
GL.StencilOp(StencilOp.Keep, StencilOp.Keep, StencilOp.Incr);
Resources.R.StencilMesh.Render();
于 2013-04-20T18:57:25.853 回答