c++ - OpenGL - 矩形中的模板测试

标签 c++ opengl graphics stencil-buffer

我打算画一个中心有洞的矩形。我正在尝试对其进行模板测试,但我无法使其正常工作。你可以在下面看到我是如何做到的。

glEnable(GL_STENCIL_TEST);
glColorMask(GL_FALSE,GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);
glStencilFunc(GL_ALWAYS, 2, ~0);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
// Draw the rectangle here
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glStencilFunc(GL_EQUAL, 2, ~0);
glStencilOp(GL_INCR, GL_INCR, GL_INCR);

我在这里做错了什么?任何帮助将不胜感激! :)

最佳答案

我假设你的情况是你已经在帧缓冲区中绘制了一些东西,现在你想绘制一个有洞的矩形,这样它就不会覆盖洞下面的东西,而是覆盖洞下面的东西非孔部分。

从逻辑上讲,这意味着您首先将绘制到模板缓冲区中,然后在绘制矩形时使用模板测试排除那些片段。

在代码中,它看起来像这样:

glEnable(GL_STENCIL_TEST);

// Fill stencil buffer with 0's
glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);

// Write 1's into stencil buffer where the hole will be
glColorMask(GL_FALSE,GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);
glStencilFunc(GL_ALWAYS, 1, ~0);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
drawHoleShape();

// Draw rectangle, masking out fragments with 1's in the stencil buffer
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthMask(GL_TRUE);
glStencilFunc(GL_NOTEQUAL, 1, ~0);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
drawRectangle();

// Cleanup, if necessary
glDisable(GL_STENCIL_TEST);

当然,您可以使用2(或任何其他模板位/值)代替1

关于c++ - OpenGL - 矩形中的模板测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32818060/

相关文章:

c++ - Qt - 打开窗口的单个实例

c++ - DirectX透明纹理-使植物看起来不错

opengl - 如何使用 glm::project 获取世界空间中某个点的坐标?

c++ - 如何根据引用进行 regex_replace

c++ - 解析函数中的命令行参数

c++ - 如何将指向 GLEW 函数的指针传递给模板?

OpenGL如何用顶点着色隐藏三角形之间的线?

opengl - gluortho2d 和 glViewport 之间的实际区别是什么

ios - 图形 - 在缓冲区之间混合而不用考虑首先渲染哪个缓冲区

c++ - 在 Arduino 上存储产品数据库