Трафаретный буфер не рисует часть тайлов - PullRequest
1 голос
/ 10 апреля 2019

Ну, я пытаюсь нарисовать плитки в буфере трафарета, но во время рисования, очевидно, происходит что-то, чего я не понимаю, и во время рисования исчезает (не рисуется) часть плиток.Итак, как я рисую:

// 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) только один раз, при первом вызове draw, и не вызываю glDisable (GL_STENCIL_TEST);И похоже, что все работает правильно, по крайней мере, сейчас я не видел никаких дефектов.Но почему это работает?

...