【问题标题】:How to do "AND" stencil in OpenGL?如何在OpenGL中做“AND”模具?
【发布时间】: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);

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

【问题讨论】:

    标签: opengl stencil-buffer


    【解决方案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();
    

    【讨论】:

    • 它产生相同的模板。这可能是因为我使用了包含深度缓冲区的 FBO,并且它不适用于模板操作...
    猜你喜欢
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 2019-11-08
    • 1970-01-01
    相关资源
    最近更新 更多