如何在OpenGL中做“AND”模具?

Posted

技术标签:

【中文标题】如何在OpenGL中做“AND”模具?【英文标题】:How to do "AND" stencil in OpenGL? 【发布时间】:2013-04-20 13:54:28 【问题描述】:

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

那么...我该怎么做呢?目前我做这样的事情:

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】:

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

三个操作分别是:

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

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

所以我会改为尝试:

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

【讨论】:

它产生相同的模板。这可能是因为我使用了包含深度缓冲区的 FBO,并且它不适用于模板操作...

以上是关于如何在OpenGL中做“AND”模具?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 GLEW 和 GLFW 以及 OpenGL 链接到 MingW 的 g++

模具工程师如何练成

OpenGL 和 SDL '#version required and missing' 但在调试中工作

CNC零件加工如何保证质量?

这个“and”语句实际上在返回中做了啥?

如何学习摸具设计?怎样学习摸具设计?学习摸具设计的方法。