1

Well, I’m trying to draw tiles into a stencil buffer, but while drawing obviously happens something that I don’t understand and during the drawing disappearing (not drawn) part of the tiles. So, how I draw:

// 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);

However, how my problem looks like?

[]1

If I disable stencil testing at all, everything is OK. And we draw it correctly.

UPD: With the help of the debug, I managed to narrow the circle of suspects ))) And I realized that the problem was somewhere in glEnable(GL_STENCIL_TEST), namely when I repeatedly call my method “draw(…)”. So, I just did the following:

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

So, now I call glEnable(GL_STENCIL_TEST) only once, at first call of draw, and didn’t call glDisable(GL_STENCIL_TEST); And it looks as if everything works correctly, at least now I didn’t see any defects. But why this works?

evaee
  • 11
  • 4

0 Answers0