c++ - 模板缓冲区不绘制部分图块
问题描述
好吧,我正在尝试将图块绘制到模板缓冲区中,但是在绘制时显然会发生一些我不理解的事情,并且在绘制过程中会消失(未绘制)部分图块。所以,我是怎么画的:
// 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); 看起来一切正常,至少现在我没有看到任何缺陷。但为什么这行得通?
解决方案
推荐阅读
- neo4j - 如何通过过滤(Neo4j,Cypher)通过多种关系类型匹配所有可能的路径
- rest - 在 REST GET 请求中传递大量数据
- mysql - 为什么我不能在 MySQL 中使用 FAST_FORWARD 数据库游标?
- javascript - 使用 `.every` 数组方法如何编写一个函数来确定数组中的每个数字是否都是平方数?
- swift - 等待布尔值“真”的更优雅的方式
- python - 为什么在张量板上没有这个 DNN 二元分类器 tf.estimator 模型的评估图?
- javascript - 如何在不影响子元素的情况下删除文本?
- python - QAction 可以用于多个任务吗?
- c++ - Fusion有尾部功能吗?
- javascript - Console.table 显示不带引号的字符串