模板缓冲区未绘制图块的一部分

时间:2019-04-10 10:57:47

标签: c++ opengl opengl-es stencil-buffer

好吧,我正在尝试将图块绘制到模板缓冲区中,但是在绘制过程中显然发生了一些我不了解的事情,并且在绘制过程中,图块的一部分消失了(未绘制)。 所以,我怎么画:

// Enable blending.
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

// Enable testing.
glEnable(GL_STENCIL_TEST);

// Disable depth test.
glDisable(GL_DEPTH_TEST);

// Set stencil buff to 0.
glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);

// Here I got all visible tiles by a camera.
auto const visible_tiles = camera.visible_tiles();

// Draw tiles into a stencil.
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glStencilMask(0xFF);

// Don't output the color.
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);

// ...

// Here I had a loop where I go through each tile from all which was visible for the camera.
auto tile_id = 1;
visible_tiles.for_each_tile([this, &tile_id](auto const& tile_position) {

    // Output tile ID into stencil buffer. I assume there will never be more than
    // 255 tiles.
    glStencilFunc(GL_ALWAYS, tile_id, 0xFF);

    mesh_->draw(); // << Here I draw.

    ++tile_id;
});

// Disable testing.
glDisable(GL_STENCIL_TEST);

但是,我的问题看起来如何?

[] 1

如果我完全禁用模板测试,则一切正常。 并且我们正确绘制了它。

UPD :借助调试,我设法缩小了可疑范围))) 我意识到问题出在glEnable(GL_STENCIL_TEST)中,即当我反复调用我的方法“ draw(…)”时。 所以,我只是做了以下事情:

static bool flag = false;
if (!flag) {
    glEnable(GL_STENCIL_TEST);
    flag = true;
}

因此,现在,在第一次调用平局时,我只调用一次glEnable(GL_STENCIL_TEST),而没有调用glDisable(GL_STENCIL_TEST); 看起来一切正常,至少现在我没有发现任何缺陷。 但是为什么行得通呢?

0 个答案:

没有答案