如何在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++